将大型CSV文件转换为JSON

时间:2013-09-12 08:44:27

标签: javascript json excel node.js csv

我不介意这是用单独的程序,Excel,NodeJS还是Web应用程序完成的。

这与此处描述的问题完全相同:

Large CSV to JSON/Object in Node.js

似乎OP没有得到工作的答案(但还是接受了吗?)。我已尝试使用它,但似乎无法让它工作。

简而言之:我正在使用~50,000行CSV,我想将其转换为JSON。我已经尝试了几乎所有在线“csv to json”webapp,所有这些都在这个庞大的数据集中崩溃。

我尝试了很多Node CSV到JSON模块,但是,它们都崩溃了。 csvtojson模块似乎很有希望,但我收到了这个错误:FATAL ERROR: JS Allocation failed - process out of memory

我该怎样做才能以可用的格式获取这些数据?如上所述,我不介意它是一个应用程序,一个在Excel,webapp或Node模块中工作的东西,只要我得到一个.JSON文件或一个我可以在Node中使用的对象。

有什么想法吗?

6 个答案:

答案 0 :(得分:13)

您提到了上面的csvtojson模块,这是我正在维护的一个开源项目。

我很抱歉它没有为你工作,这是几个月前解决的一个bug造成的。 我还在自述文件的README中添加了一些额外的行。请查看Process Big CSV File in Command Line

请确保您拥有最新的csvtojson版本。 (目前是0.2.2)

您可以通过运行

来更新它
npm install -g csvtojson

在你installed latest csvtojson之后,你只需要运行:

csvtojson [path to bigcsvdata] > converted.json

此流来自csvfile的数据。或者,如果您想要从其他应用程序流式传输数据:

cat [path to bigcsvdata] | csvtojson > converted.json

他们会输出同样的东西。

我已经用超过300万条记录的csv文件手动测试了它,它没有问题。

我相信你只需要一个简单的工具。 lib的目的是为了缓解这样的压力。如果下次遇到任何问题,请告诉我,以便及时解决。

答案 1 :(得分:5)

npm csv包能够处理CSV流,而无需将完整文件存储在内存中。您需要安装node.js和csv(npm install csv)。这是一个示例应用程序,它将JSON对象写入文件:

var csv = require('csv')
var fs = require('fs')
var f = fs.createReadStream('Fielding.csv')
var w = fs.createWriteStream('out.txt')

w.write('[');

csv()
.from.stream(f, {columns:true})
.transform(function(row, index) {
    return (index === 0 ? '' : ',\n') + JSON.stringify(row);
})
.to.stream(w, {columns: true, end: false})
.on('end', function() {
     w.write(']');
     w.end();
 });

请注意{JEN对象中保留列名称所需的columns选项(否则您将得到一个简单的数组),end选项设置为false,告诉节点在CSV流关闭时不关闭文件流:这允许我们添加最后一个']'。 transform回调为程序提供了一种挂钩数据流并在将数据写入下一个流之前对其进行转换的方法。

答案 2 :(得分:2)

使用如此大的数据集时,需要编写流处理而不是加载>转换>保存。加载这么大的东西 - 不适合记忆。

CSV文件本身很简单,格式差别不大。所以你可以自己编写简单的解析器。同样,JSON通常也很简单,并且可以逐行处理,而无需加载整个东西。

    来自CSV文件的
  1. createReadStream
  2. 用于新JSON文件的createWriteStream。
  3. on('data', ...)进程读取数据:附加到常规字符串,并提取完整行(如果可用)。
  4. 在途中,如果readStream中有行/行,则将它们转换为JSON对象并推入新JSON文件的writeStream。
  5. 这对于pipe以及中间的自有管道是可行的,它会将行转换为要写入新文件的对象。

    这种方法可以避免将整个文件加载到内存中,但是会随着加载部分逐步处理,处理并写入并缓慢前进。

答案 3 :(得分:1)

您可以尝试使用OpenRefine(或Google Refine)。

导入CSV文件。然后你可以导出。编辑JSON格式的模板。

http://multimedia.journalism.berkeley.edu/tutorials/google-refine-export-json/

答案 4 :(得分:0)

这应该可以胜任。

npm i --save csv2json fs-extra // install the modules

const csv2json = require('csv2json');
const fs = require('fs-extra');

const source = fs.createReadStream(__dirname + '/data.csv');
const output = fs.createWriteStream(__dirname + '/result.json');
 source
   .pipe(csv2json())
   .pipe(output );

答案 5 :(得分:0)

  • 使用python CLI

将文件夹中的所有csv文件转换为json文件,而不转换为\n\r

import json
import csv

for x in range(1, 11):
    f = open('9447440523-Huge'+str(x)+'.csv', 'r')
    reader = csv.DictReader(f)
    i=0;
    jsonoutput = str(x)+'.json'
    with open(jsonoutput, 'a') as f:
            f.write('[')
            for x in reader:
                json.dump(x, f)
                f.write(',')
            f.write(']')