UNPKG

@qso-soft/shared

Version:

Shared library for QSO-soft

79 lines 3.07 kB
import fs from 'fs'; import csvtojson from 'csvtojson'; import { printResults } from './print'; export const convertAndWriteToJSON = async ({ inputPath, outputPath, logger, withSaving }) => { const jsonArray = []; const logTemplate = { action: 'convertAndWriteToJSON', status: 'in progress', }; logger?.info(`Reading from ${inputPath}...`, logTemplate); await csvtojson() .fromFile(inputPath) .subscribe((jsonObj) => { jsonArray.push(jsonObj); }, (error) => { if (error) { logger?.error('Error reading CSV file in subscribe block! Probably wrong path or file name', { ...logTemplate, status: 'failed', }); } }) .on('done', (error) => { if (error) { logger?.error('Error reading data from subscription CSV file! Probably wrong path or file name', { ...logTemplate, status: 'failed', }); } if (withSaving) { if (outputPath && jsonArray?.length) { logger?.info(`Writing JSON to ${outputPath}...`, logTemplate); if (!fs.existsSync(outputPath)) { fs.writeFileSync(outputPath, ''); } fs.writeFileSync(outputPath, JSON.stringify(jsonArray, null, 2)); } else { logger?.error('Error writing data to JSON file! Probably wrong path or file name', logTemplate); } } }); return jsonArray; }; export const readAndParseFromJSON = async ({ inputPath, encode, logger }) => { const logTemplate = { action: 'readAndParseFromJSON', status: 'in progress', }; logger?.info(`Reading from ${inputPath}...`, logTemplate); const encoding = encode ?? 'utf8', data = await fs.promises.readFile(inputPath, encoding); logger?.info(`Parsing data from ${inputPath}...`, logTemplate); return JSON.parse(data); }; export const convertToCSV = (data, columnDelimiter = ',', lineDelimiter = '\n') => { let csvString = ''; const allKeys = data.reduce((acc, item) => [...acc, ...Object.keys(item)], []); const headers = [...new Set(allKeys)]; csvString += headers.join(columnDelimiter) + lineDelimiter; for (let i = 0; i < data.length; i++) { let ctr = 0; const item = data[i]; for (let j = 0; j < headers.length; j++) { const header = headers[j]; if (ctr > 0) { csvString += columnDelimiter; } csvString += item && header && item[header] !== undefined ? item[header] : ''; ctr++; } csvString += lineDelimiter; } return csvString; }; export const convertToCsvAndWrite = ({ data, fileName, outputPath, columnDelimiter, lineDelimiter, }) => { const csvStringData = convertToCSV(data, columnDelimiter, lineDelimiter); printResults({ data: csvStringData, fileName, outputPath }); }; //# sourceMappingURL=csv-converters.js.map