【问题标题】:Convert large CSV files to JSON [closed]将大型 CSV 文件转换为 JSON [关闭]
【发布时间】:2013-09-16 13:25:39
【问题描述】:

我不介意这是通过单独的程序、Excel、NodeJS 或 Web 应用程序完成的。

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

Large CSV to JSON/Object in Node.js

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

简而言之:我正在使用约 50,000 行的 CSV,我想将其转换为 JSON。我已经尝试了几乎所有在线“csv to json”网络应用程序,都在这么大的数据集下崩溃了。

我已经尝试了许多Node CSV 到 JSON 模块,但同样,它们都崩溃了。 csvtojson 模块看起来很有希望,但我收到了这个错误:FATAL ERROR: JS Allocation failed - process out of memory

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

有什么想法吗?

【问题讨论】:

  • 尝试自己写,不时保存到数据库或磁盘中

标签: javascript json excel node.js csv


【解决方案1】:
  • 使用 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(']')

【讨论】:

    【解决方案2】:

    这应该可以完成工作。

    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 );
    

    【讨论】:

    • 我在一个文件中有 80 条记录。这段代码帮助我在几秒钟内完成转换。谢谢@Bogadan
    • 您已将此代码添加到存储中的一个文件中。你能帮我进入一个变量以在代码中使用吗?
    【解决方案3】:

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

    很抱歉,它没有为您解决问题,这是由几个月前解决的错误引起的。 我还在 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的目的就是像这样缓解压力。下次遇到问题请务必告诉我,以便我及时解决。

    【讨论】:

    • 我正在尝试使用 csvtojson 来处理一个巨大的 csv 文件(~5GB/1100 万行)。我已将文件拆分为多个文件(每个文件大约 20MB/40k 行)。即使我按顺序处理这些文件,该过程也会继续运行,但在处理了大约 50k 行后会停止向 json 文件写入更多数据。有什么线索吗?
    • 您能否粘贴一些代码来说明如何使用它来处理 CSV 文件?直接用5GB的csv应该没问题。
    • 我正在使用 cli csvtojson --delimiter=## x.csv > y.json
    • 您使用的是什么版本的 csvtojson?如果可以的话,更新到最新版本..使用 >npm install -g csvtojson
    • 来自 package.json: "version": "0.3.21"
    【解决方案4】:

    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();
     });
    

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

    【讨论】:

    • 对不起,我在这里回复有点晚了。这很接近,除了创建的 out.text 不是正确的 JSON 格式,而是它只是一个包含对象行的文件(它需要在开头有一个 [,在结尾有一个 ],以及每行末尾的逗号)。如果您编辑以更正此问题,我将接受作为答案。
    【解决方案5】:

    当你处理这么大的数据集时,你需要编写流处理而不是加载>转换>保存。由于加载这么大的东西 - 不适合内存。

    CSV 文件本身非常简单,格式差异不大。所以你可以自己编写简单的解析器。 JSON 通常也很简单,并且可以轻松地逐行处理,而无需加载整个内容。

    1. createReadStream 来自 CSV 文件。
    2. 为新的 JSON 文件创建WriteStream。
    3. on('data', ...) 处理读取数据:附加到一般字符串,并在可用时提取整行。
    4. 在路上,如果 readStream 中可用的行/行,将它们转换为 JSON 对象并推送到新 JSON 文件的 writeStream 中。

    这对于pipe 和中间的自己的管道非常可行,它将将行转换为要写入新文件的对象。

    这种方法可以避免将整个文件加载到内存中,而是随着加载部分逐渐处理它,处理并写入它,然后慢慢前进。

    【讨论】:

      猜你喜欢
      • 2018-07-14
      • 2016-04-12
      • 1970-01-01
      • 2010-10-14
      • 1970-01-01
      • 2015-05-19
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多