import { readFile } from 'fs/promises'; import stringify from 'csv-stringify'; import parse from 'csv-parse'; import { promises as fsPromises } from 'fs'; export interface Content { [key: string]: number | string | null; } export function arr2csvRow(arr: string[]): Promise { return new Promise((resolve, reject) => { stringify([arr], { quoted: false }, (err, data) => { resolve(data); }); }); } export function obj2csvRow( title: string[], content: Content, ): Promise { return new Promise((resolve, reject) => { stringify([content], { columns: title, quoted: true }, (err, data) => { resolve(data); }); }); } export async function createCsvFile( filePath: string, title: string[], content: Content[], ): Promise { return new Promise((resolve, reject) => { stringify(content, { columns: title, header: true }, (err, data) => { fsPromises.writeFile(filePath, data, 'utf-8').then(() => { resolve(); }); }); }); } export async function csvStr2obj(fileContent: string): Promise { return new Promise((resolve, reject) => { parse(fileContent, { columns: true }, (err, output) => { resolve(output); }); }); } export async function csvStr2arr(fileContent: string): Promise { return new Promise((resolve, reject) => { parse(fileContent, (err, output) => { resolve(output); }); }); } export async function readCsvFile(filePath: string): Promise { const fileContent = await readFile(filePath, { encoding: 'utf-8' }); return csvStr2obj(fileContent); } export async function isCsv(csvRow: string, count: number): Promise { const output = await csvStr2arr(csvRow); let isOk = false; if (output?.length === 1) { isOk = output[0].length === count; } return Promise.resolve(isOk); } export async function isCsvRow(csvRow: string, count: number): Promise { const isQuotation = csvRow.includes('"'); if (isQuotation) { return isCsv(csvRow, count); } const commaCorrect = (csvRow.split(',').length) === count; return Promise.resolve(commaCorrect); }