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

使用Node.js将CSV转JSON时出现多余sep=;内容的解决方法

解决CSV转JSON时的sep=;干扰问题

问题背景

我有一个包含3个字段的CSV文件,运行时下载后想用Node.js将其转换为JSON格式,但转换结果不符合预期。

预期JSON格式

[
    [
        "PO_NO",
        "PO_LINE_ID",
        "MAT_ID"
    ],
    {
        "PO_NO": "2044344",
        "PO_LINE_ID": "1",
        "MAT_ID": "XZZ04152-100-994"
    },
    {
         "PO_NO": "2044344",
        "PO_LINE_ID": "2",
        "MAT_ID": "XZZ04152-100-992"
    }
]

实际异常转换结果

[
  [
    "sep=;"
  ],
  {
    "sep=;": "PO_NO;PO_LINE_ID;MAT_ID"
  },
  {
    "sep=;": "2044344;1;XZZ04152-100-994"
  },
  {
    "sep=;": "2044344;2;XZZ04152-100-992"
  }
]

现有转换代码

const csvFilePath = 'cypress/logger/Dataset.csv'; // CSV文件路径
const fs = require('fs');
const csv = require('csv-parser');

const results = [];

fs.createReadStream(csvFilePath)
    .pipe(csv())
    .on('headers', (headers) => {
        results.push(headers); // 将表头作为结果数组的第一个元素
    })
    .on('data', (data) => {
        results.push(data);
    })
    .on('end', () => {
        const jsonData = JSON.stringify(results);
        fs.writeFile('cypress/logger/Datasetfile1.json', jsonData, (err) => {
            if (err) {
                console.error('写入JSON文件出错:', err);
            } else {
                console.log('CSV转JSON完成。');
            }
        });
    });

问题根源

打开CSV文件后发现首行是sep=;,这是Excel导出CSV时自动添加的分隔符声明行,但csv-parser默认不识别该行,导致工具错误识别分隔符和表头,进而生成异常的JSON结构。CSV原始内容如下:

sep=;
PO_NO;PO_LINE_ID;MAT_ID;
0002044344;1;XZZ04152-100-994;
0002044344;2;XZZ04152-100-992;
0002044344;3;XZZ04152-997-992;

解决方案

方案1:直接配置csv-parser跳过首行并指定分隔符

这是最简洁的方式,通过csv()的配置参数跳过首行,同时明确指定分隔符为分号:

const csvFilePath = 'cypress/logger/Dataset.csv';
const fs = require('fs');
const csv = require('csv-parser');

const results = [];

fs.createReadStream(csvFilePath)
    // 跳过首行的sep=;,指定分隔符为分号
    .pipe(csv({ skipLines: 1, separator: ';' }))
    .on('headers', (headers) => {
        // 移除表头末尾的空字段(因为CSV行尾有多余分号)
        const cleanedHeaders = headers.filter(header => header.trim() !== '');
        results.push(cleanedHeaders);
    })
    .on('data', (data) => {
        // 清理数据中的空字段,可选:去掉PO_NO的前置零
        const cleanedData = {};
        Object.keys(data).forEach(key => {
            if (key.trim() !== '') {
                let value = data[key];
                if (key === 'PO_NO') {
                    value = value.replace(/^0+/, ''); // 移除前置零
                }
                cleanedData[key] = value;
            }
        });
        results.push(cleanedData);
    })
    .on('end', () => {
        const jsonData = JSON.stringify(results, null, 2);
        fs.writeFile('cypress/logger/Datasetfile1.json', jsonData, (err) => {
            if (err) {
                console.error('写入JSON文件失败:', err);
            } else {
                console.log('CSV转JSON完成。');
            }
        });
    });

方案2:手动过滤首行数据流(更灵活)

如果需要自定义处理行逻辑,可以用split2拆分数据流,过滤首行后再传给csv-parser:

  1. 先安装依赖:npm install split2
  2. 修改代码:
const csvFilePath = 'cypress/logger/Dataset.csv';
const fs = require('fs');
const csv = require('csv-parser');
const split = require('split2');

const results = [];
let isFirstLine = true;

fs.createReadStream(csvFilePath)
    .pipe(split())
    .on('data', function(line) {
        if (isFirstLine) {
            isFirstLine = false;
            return; // 跳过首行的sep=;
        }
        this.push(line + '\n'); // 将处理后的行传给下一个流
    })
    .pipe(csv({ separator: ';' }))
    .on('headers', (headers) => {
        const cleanedHeaders = headers.filter(header => header.trim() !== '');
        results.push(cleanedHeaders);
    })
    .on('data', (data) => {
        const cleanedData = {};
        Object.keys(data).forEach(key => {
            if (key.trim() !== '') {
                let value = data[key];
                if (key === 'PO_NO') {
                    value = value.replace(/^0+/, '');
                }
                cleanedData[key] = value;
            }
        });
        results.push(cleanedData);
    })
    .on('end', () => {
        const jsonData = JSON.stringify(results, null, 2);
        fs.writeFile('cypress/logger/Datasetfile1.json', jsonData, (err) => {
            if (err) {
                console.error('写入JSON文件失败:', err);
            } else {
                console.log('CSV转JSON完成。');
            }
        });
    });

关键说明

  • sep=;是Excel专属的分隔符声明,csv-parser默认不支持,必须手动跳过。
  • 指定separator: ';'确保工具用正确的分隔符拆分字段,避免把整行当成单个字段。
  • 过滤空字段是因为CSV每行末尾有多余分号,会生成无效的空键值对,影响后续数据处理。

内容的提问来源于stack exchange,提问作者Muneeb

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.24 17:05:14