Node.js中的大型CSV到JSON/Object

nev*_*fox 13 javascript csv json node.js

我正在尝试做一些似乎不仅要完成相当简单的事情,而且要做一个足够普通的任务,以便有可用的简单包.我希望获取一个大型CSV文件(从关系数据库表导出)并将其转换为JavaScript对象数组.此外,我想将其导出到.json文件夹具.

示例CSV:

a,b,c,d
1,2,3,4
5,6,7,8
...
Run Code Online (Sandbox Code Playgroud)

期望的JSON:

[
{"a": 1,"b": 2,"c": 3,"d": 4},
{"a": 5,"b": 6,"c": 7,"d": 8},
...
]
Run Code Online (Sandbox Code Playgroud)

我已经尝试了几个节点CSV解析器,流式传输器,自称为CSV到JSON的库,但我似乎无法得到我想要的结果,或者如果我能它只能在文件较小的情况下工作.我的文件大小接近1 GB,行数约为40 m(可创建40 m对象).我希望它需要流输入和/或输出以避免内存问题.

以下是我尝试过的软件包:

我正在使用Node 0.10.6,并希望了解如何轻松完成此操作.滚动我自己可能是最好的,但我不知道从哪里开始使用Node的所有流功能,特别是因为他们在0.10.x中更改了API.

Key*_*ang 8

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

或从NPM回购安装:

npm install -g csvtojson
Run Code Online (Sandbox Code Playgroud)

它支持任何大小的csv数据/字段类型/嵌套json等.一堆功能.

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);
Run Code Online (Sandbox Code Playgroud)

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

csvtojson myCSVFile.csv
Run Code Online (Sandbox Code Playgroud)


Myr*_*tol 3

虽然这远不是​​一个完整的答案,但您可以将您的解决方案基于https://github.com/dominictarr/event-stream。自述文件中的改编示例:

    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
      )
Run Code Online (Sandbox Code Playgroud)

之后,我希望每行都有一堆字符串化的 JSON 对象。然后需要将其转换为数组,您可以使用该数组并将其附加,到每行的末尾,在最后删除它,然后将[和添加]到文件的开头和结尾。

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

我确实注意到该库没有在 0.10 上进行测试(至少没有在 Travis 上进行测试),所以要小心。也许npm test你自己运行源代码。