You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何合并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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.03 07:06:01