Tengo un archivo de registros (uno por línea):
Record1 Record2 Record3 Estoy usando los módulos fs y readline para eso:
const rs = fs.createReadStream('input.txt'); const ws = fs.createWriteStream('output.json', { encoding: "utf8" }); const rl = readline.createInterface({ input: rs, crlfDelay: Infinity, }); ws.write('['); for await (const line of rl) { ws.write(`${line},\n`); } ws.end(']');Pero este ciclo también arrojará una coma final al final del archivo, lo cual es malo porque las comas finales no están permitidas en JSON.
El problema es que no quiero leer todo el archivo en la memoria y no sé la cantidad de registros por adelantado.
Editar:
Este es un ejemplo simple, pero en el código real, el registro se transforma en un registro json, pero es irrelevante.
Al crear una variable local para rastrear si ya encontró el primer registro, puede anteponer la coma a todas las entradas después de la primera, logrando el mismo efecto:
Tenga en cuenta que, debido a que los espacios en blanco son insignificantes en JSON, disminuirá el tamaño del archivo resultante al omitir las líneas nuevas
ws.write('['); let comma = false; for await (const line of rl) { if (!line.trim()) continue; if (comma) ws.write(','); ws.write(line); comma = true; } ws.end(']');