Node.js中CSV转JSON解析时首个键自动加单引号的问题及解决
问题
使用Node.js的csv.parse模块解析CSV为JSON时,每个对象的第一个键(比如ObjNr)会自动被添加单引号,更换首列后新的首键依然会出现这个情况,如何避免?
CSV示例
ObjNr;Brand;Model;Manufactured;kW;Price 2022-15-06#1;Mercedes;EQS-450;2022;363;94000 2022-15-06#2;Mercedes;EQA-350;2021;295;43556
后端代码
app.post('/testcsv', uploadCSV.single('car_csv'), async (req, res) => { try { let csvJson; const csvData = req.file.buffer.toString(); // Parse CSV data to JSON; first row is header; csv.parse( csvData, { delimiter: ';', columns: true}, async (err, data) => { if (err) { console.error('CSV parsing error:', err); } else { csvJson = data; console.log(csvData); console.log(csvJson); res.status(200).send(csvJson); } } ); } catch (err) { console.error(err); } });
输出结果
[ { 'ObjNr': '2022-15-06#1', Brand: 'Mercedes', Model: 'EQS-450', Manufactured: '2022', kW: '363', Price: '94000' }, { 'ObjNr': '2022-15-06#2', Brand: 'Mercedes', Model: 'EQA-350', Manufactured: '2021', kW: '295', Price: '43556' } ]
解决方案
原因分析
这个现象不是csv.parse模块主动给键添加单引号,而是CSV文件的首行开头存在不可见的BOM(字节顺序标记)。当buffer转字符串时,BOM会附着在第一个表头的最前面,导致该键名实际包含了不可见的特殊字符——在控制台输出或JSON格式化时,为了区分这个带特殊字符的非标准标识符,才会给键名加上单引号(正常合法的标识符不需要引号包裹)。
解决步骤
- 移除BOM字符:在将buffer转为字符串后,手动清除开头的BOM,用正则表达式即可实现:
const csvData = req.file.buffer.toString().replace(/^\uFEFF/, '');
- 验证效果:修改后
csv.parse拿到的表头不再包含BOM,解析后的键名会和其他键一样正常显示,不会再出现单引号。
修改后的完整代码片段:
app.post('/testcsv', uploadCSV.single('car_csv'), async (req, res) => { try { let csvJson; // 移除开头的BOM字符 const csvData = req.file.buffer.toString().replace(/^\uFEFF/, ''); csv.parse( csvData, { delimiter: ';', columns: true}, async (err, data) => { if (err) { console.error('CSV parsing error:', err); } else { csvJson = data; console.log(csvJson); res.status(200).send(csvJson); } } ); } catch (err) { console.error(err); } });
额外提示
如果CSV文件是用Excel生成的,在UTF-8编码下很容易自动添加BOM。后续创建CSV文件时,选择UTF-8无BOM编码格式,就能从根源避免这个问题。
内容的提问来源于stack exchange,提问作者zuzuzuu
相关产品推荐
相关产品推荐

