使用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:
- 先安装依赖:
npm install split2 - 修改代码:
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
相关产品推荐
相关产品推荐

