一尘不染

将大型CSV转换为Node.js中的JSON /对象

node.js

我正在尝试做的事情似乎不仅应该很简单地完成,而且应该是足够普通的任务,以至于可以使用简单的程序包来完成它。我希望获取一个大型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},
...
]

我已经尝试了几个节点CSV解析器,流媒体,自称CSV到JSON的库,但是似乎无法获得想要的结果,或者如果文件较小,它是否可以工作。我的文件大小接近1
GB,约有4000万行(这将创建40m个对象)。我希望它将需要流输入和/或输出以避免内存问题。

这是我尝试过的软件包:

我正在使用Node
0.10.6,希望就如何轻松实现这一目标提出建议。最好自己滚动,但我不确定从Node的所有流功能开始,尤其是因为它们在0.10.x中更改了API。


阅读 325

收藏
2020-07-07

共1个答案

一尘不染

尽管这还不是一个完整的答案,但是您可以将解决方案基于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
      )

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

parseCSVLine必须将功能配置为将CSV值分配给正确的对象属性。在传递文件的第一行之后,可以很容易地做到这一点。

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

2020-07-07