我正在尝试做的事情似乎不仅应该很简单地完成,而且应该是足够普通的任务,以至于可以使用简单的程序包来完成它。我希望获取一个大型CSV文件(从关系数据库表中导出),并将其转换为JavaScript对象数组。此外,我想将其导出到.json文件装置中。
.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。
尽管这还不是一个完整的答案,但是您可以将解决方案基于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值分配给正确的对象属性。在传递文件的第一行之后,可以很容易地做到这一点。
parseCSVLine
我确实注意到该库未在0.10上进行测试(至少没有在Travis上进行测试),所以请当心。也许npm test自己在源上运行。
npm test