Node.js中使用csv-parser转换CSV为JSON异常问题排查
解决csv-parser转换CSV到JSON返回字符串而非对象的问题
问题场景
有一个包含表头的CSV文件,内容示例如下:
CountryName,CapitalName,CapitalLatitude,CapitalLongitude,CountryCode,ContinentName Somaliland,Hargeisa,9.55,44.050000,NULL,Africa South Georgia and South Sandwich Islands,King Edward Point,-54.283333,-36.500000,GS,Antarctica French Southern and Antarctic Lands,Port-aux-Français,-49.35,70.216667,TF,Antarctica Palestine,Jerusalem,31.766666666666666,35.233333,PS,Asia Aland Islands,Mariehamn,60.116667,19.900000,AX,Europe
使用Node.js的csv-parser模块转换时,未得到预期的JSON对象数组,反而返回原始字符串内容。原代码如下:
const fs = require('fs'); const csv = require('csv-parser'); const dataResults = []; const fileHeaders = [ 'CountryName', 'CapitalName', 'CapitalLatitude', 'CapitalLongitude', 'CountryCode', 'ContinentName' ] // reads the file var readFile = fs.createReadStream(__dirname + '/country-capitals.csv','utf-8'); readFile.pipe(csv({separator: '\n', headers:fileHeaders})) // event handler that handels the data readFile.on('data', (data)=>dataResults.push(data)) readFile.on('end',()=>{ console.log(dataResults); })
错误原因
- 分隔符设置错误:将
separator设为\n(换行符),但csv-parser中separator是列的分隔符,CSV文件默认用逗号,分隔列,换行是行分隔符无需手动指定。 - 事件监听对象错误:监听了原始文件流
readFile的data事件,该事件返回的是文件的原始字符串块;应该监听pipe之后的csv-parser流的data事件,才能获取解析后的对象。
修正后的代码
const fs = require('fs'); const csv = require('csv-parser'); const dataResults = []; // CSV文件已有表头,无需手动指定headers,若需自定义键名可保留 // const fileHeaders = [ // 'CountryName', // 'CapitalName', // 'CapitalLatitude', // 'CapitalLongitude', // 'CountryCode', // 'ContinentName' // ] const readFile = fs.createReadStream(__dirname + '/country-capitals.csv', 'utf-8'); // 移除错误的separator设置,csv-parser默认用逗号分隔列 const parseStream = readFile.pipe(csv()); // 监听csv-parser流的data事件,获取解析后的对象 parseStream.on('data', (data) => dataResults.push(data)); parseStream.on('end', () => { console.log(dataResults); // 若需要转为格式化的JSON字符串,可使用: // console.log(JSON.stringify(dataResults, null, 2)); });
补充说明
- 如果CSV文件的表头和你期望的键名完全一致,无需手动设置
headers参数,csv-parser会自动将第一行作为对象的键名;如果需要自定义键名,再保留headers配置即可。 - 修正后
dataResults会存储由解析后的对象组成的数组,完全符合预期的JSON格式结构。
内容的提问来源于stack exchange,提问作者Daniel Raviv
相关产品推荐
相关产品推荐

