@qso-soft/shared
Version:
Shared library for QSO-soft
79 lines • 3.07 kB
JavaScript
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