Supongamos que tengo el código de la siguiente manera:
const fs = require('node:fs') const csvParser = require('csv-parser') const rs = fs.createReadStream(dir) const ws = fs.createWriteStream(outDir) ws.write('[' + '\n') rs.pipe( csvParser({ mapHeaders: mapper, }), ) .on('data', (data) => { ws.write('\t' + JSON.stringify({ ...data, provider } + ',\n')) }) .on('end', () => { ws.write(']') console.log('writing to a file has been completed >> ', OUT_DIR) })Básicamente, lo que hace este código es leer un archivo csv grande y luego transmitirlo para escribir un archivo json. Como se ve en el código, agrego ',\n' como separador para cada fila, de modo que todo el código json se formatea una vez que se completa la transmisión.
El problema con dicho método es que deja una coma al final de cada entrada que tendría que formatear manualmente el archivo (es decir, eliminar la coma final) cada vez que se completa la escritura del documento.
Por ejemplo, el resultado sería así:
[ {"key1":"value1", "key2":"value2"}, {"key1":"value1", "key2":"value2"}, // <- note the trailing comma here. ]¿Alguna sugerencia sobre cómo manejar la coma final? Además, ¿cuál sería una forma alternativa de manejar mejor el flujo de lectura y escritura? Por favor, hágamelo saber. Gracias por adelantado.
Invertiría el problema e incluiría la coma antes de cada elemento excepto el primero.
let first = true; ws.write('[' + '\n') // ... .on('data', (data) => { if (!first) { ws.write(',\n'); } first = false; ws.write('\t' + JSON.stringify({ ...data, provider })) })[EDITAR] como se menciona en los comentarios, esto anula el propósito de usar stream. No use esto en archivos realmente grandes
No manejaría el coma final, pero así es como lo haría. La idea es insertar cada fila en una matriz y JSON.stringify() en toda la matriz.
Algo como esto
const rows = [] rs.pipe( csvParser({ mapHeaders: mapper, }), ) .on('data', (data) => { rows.push({ row content }) }) .on('end', () => { ws.write(JSON.stringify(rows)) console.log('writing to a file has been completed >> ', OUT_DIR) })Probablemente haya una mejor manera de hacerlo, pero yo haría algo como esto:
const fs = require('node:fs') const csvParser = require('csv-parser') const rs = fs.createReadStream(dir) const ws = fs.createWriteStream(outDir) let buffer = null; ws.write('[' + '\n') rs.pipe( csvParser({ mapHeaders: mapper, }), ) .on('data', (data) => { if (buffer) { ws.write(buffer + ',\n')) } buffer = '\t' + JSON.stringify({ ...data, provider }) }) .on('end', () => { ws.write(buffer + '\n')) ws.write(']') console.log('writing to a file has been completed >> ', OUT_DIR) })