Node.js中的大CSV到JSON /对象

我正在尝试做一些看似不仅要相当简单的事情,而且还要有一个共同的任务,那就是提供简单的包。 我想要一个大的CSV文件(从关系数据库表中导出)并将其转换为JavaScript对象数组。 此外,我想将其导出到.json文件夹具。

CSV示例:

 a,b,c,d 1,2,3,4 5,6,7,8 ... 

期望的JSON:

 [ {"a": 1,"b": 2,"c": 3,"d": 4}, {"a": 5,"b": 6,"c": 7,"d": 8}, ... ] 

我已经尝试了几个节点的CSVparsing器,拖放器,自我宣称的CSV到JSON库,但我似乎无法得到我想要的结果,或者如果可以的话,只有在文件较小时才能使用。 我的文件大约有1 GB大小,约40米行(这将创build40米的对象)。 我期望它需要stream式input和/或输出以避免内存问题。

这里是我试过的软件包:

  • https://github.com/klaemo/csv-stream
  • https://github.com/koles/ya-csv
  • https://github.com/davidgtonge/stream-convert (工作,但它非常慢,无用,因为我经常改变数据集,它花了近3个小时来parsing一个60 MB的csv文件)
  • https://github.com/cgiffard/CSVtoJSON.js
  • https://github.com/wdavidw/node-csv-parser (似乎没有被devise为将csv转换为其他格式)
  • https://github.com/voodootikigod/node-csv

我使用的节点0.10.6,并希望如何轻松完成这一build议。 滚动我自己可能是最好的,但我不知道从哪里开始的所有节点的streamfunction,特别是因为他们改变了0.10.x的API。

虽然这还远远没有一个完整的答案,您可以在https://github.com/dominictarr/event-stream上find解决scheme。 自述文件中的示例:

  var es = require('event-stream') es.pipeline( //connect streams together with `pipe` process.openStdin(), //open stdin es.split(), //split stream to break on newlines es.map(function (data, callback) { //turn this async function into a stream callback(null , JSON.stringify(parseCSVLine(data))) // deal with one line of CSV data }), process.stdout ) 

之后,我希望你在每一行上都有一堆string化的JSON对象。 然后这需要转换成一个数组,你可以使用和追加到每一行的末尾,最后删除它,然后将[]添加到文件的开头和结尾。

必须将parseCSVLine函数configuration为将CSV值分配给正确的对象属性。 在传递文件的第一行之后,这可以相当容易地完成。

我注意到图书馆没有testing0.10(至less不是与特拉维斯),所以要小心。 也许可以对源代码自己运行npm test

检查可用作库,命令行工具或Web服务器插件的node.js csvtojson模块。 https://www.npmjs.org/package/csvtojson 。 源代码可以在https://github.com/Keyang/node-csvtojsonfind

或从NPM回购安装:

 npm install -g csvtojson 

它支持任何大小的CSV数据/字段types/嵌套JSON等一堆function。

 var Converter=require("csvtojson").core.Converter; var csvConverter=new Converter({constructResult:false, toArrayString:true}); // The constructResult parameter=false will turn off final result construction in memory for stream feature. toArrayString will stream out a normal JSON array object. var readStream=require("fs").createReadStream("inputData.csv"); var writeStream=require("fs").createWriteStream("outpuData.json"); readStream.pipe(csvConverter).pipe(writeStream); 

您也可以将其用作cli工具:

 csvtojson myCSVFile.csv 

我发现更简单的方法来使用csvtojson读取CSV数据。

代码如下:

 var Converter = require("csvtojson").Converter; var converter = new Converter({}); converter.fromFile("sample.csv",function(err,result){ var csvData = JSON.stringify ([ {resultdata : result[0]}, {resultdata : result[1]}, {resultdata : result[2]}, {resultdata : result[3]}, {resultdata : result[4]} ]); csvData = JSON.parse(csvData); console.log(csvData); }); 

我build议你自己实施这个逻辑。 Node.js对于这些types的任务其实是相当不错的。

下面的解决scheme是使用stream,因为它们不会炸毁你的内存。

安装依赖关系

 npm install through2 split2 --save 

 import through2 from 'through2' import split2 from 'split2' fs.createReadStream('<yourFilePath>') // Read line by line .pipe(split2()) // Parse CSV line .pipe(parseCSV()) // Process your Records .pipe(processRecord()) const parseCSV = () => { let templateKeys = [] let parseHeadline = true return through2.obj((data, enc, cb) => { if (parseHeadline) { templateKeys = data .toString() .split(';') parseHeadline = false return cb(null, null) } const entries = data .toString() .split(';') const obj = {} templateKeys.forEach((el, index) => { obj[el] = entries[index] }) return cb(null, obj) }) } const processRecord = () => { return through2.obj(function (data, enc, cb) { // Implement your own processing // logic here eg: MyDB .insert(data) .then(() => cb()) .catch(cb) }) } 

有关该主题的更多信息,请访问Stefan Baumgartners关于此主题的出色教程 。