如何合并Node.js csvtojson代码实现CSV转JSON数组并写入文件
问题原因
- csvtojson的
subscribe回调是逐行触发的,每次回调参数dataObj是当前解析完成的单条JSON对象,直接在回调里调用fs.writeFile会每次用新的单行对象覆盖旧文件,最终自然只会保留最后一行的结果。
正确合并后的完整代码
const fs = require("fs"); const csvtojson = require("csvtojson"); let fileReadStream = fs.createReadStream("myCsvFile.csv"); let invalidLineCount = 0; // 声明空数组存储所有合法的解析结果 const jsonResult = []; csvtojson({ "delimiter": ";", "fork": true }) .preFileLine((fileLineString, lineIdx)=> { let invalidLinePattern = /^['"].*[^"'];/; if (invalidLinePattern.test(fileLineString)) { console.log(`Line #${lineIdx + 1} is invalid, skipping:`, fileLineString); fileLineString = ""; invalidLineCount++; } return fileLineString }) .fromStream(fileReadStream) .subscribe((dataObj) => { console.log(dataObj); // 每次解析完一行就把当前对象推入结果数组 jsonResult.push(dataObj); }) // 所有行解析完成后触发该回调 .then(() => { // 一次性把完整数组写入文件 fs.writeFile('example.json', JSON.stringify(jsonResult, null, 4), (err) => { if (err) { console.error('文件写入失败:', err); return; } console.log(`转换完成,共跳过${invalidLineCount}行无效数据,结果已保存到example.json`); }) }) .catch(err => { console.error('CSV解析过程出错:', err); });
补充说明
如果需要处理GB级别的超大CSV文件,不想占用太多内存,可以改用流式写入方案,自己处理JSON数组的格式标识(开头加[、对象之间加,、结尾加])即可,普通小文件用上述方案完全足够。
内容的提问来源于stack exchange,提问作者HamiD
相关产品推荐
相关产品推荐

