将大型 CSV 文件转换为 JSON [关闭]

Posted

技术标签:

【中文标题】将大型 CSV 文件转换为 JSON [关闭]【英文标题】:Convert large CSV files to JSON [closed] 【发布时间】: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 中使用的对象。

有什么想法吗?

【问题讨论】:

尝试自己写,不时保存到数据库或磁盘中 【参考方案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 通常也很简单,并且可以轻松地逐行处理,而无需加载整个内容。

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

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

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

【讨论】:

以上是关于将大型 CSV 文件转换为 JSON [关闭]的主要内容,如果未能解决你的问题,请参考以下文章

在 Java 中将 JSON 转换为 XLS/CSV [关闭]

使用带有过滤器和其他列的 pyspark 将 CSV 转换为 JSON [关闭]

使用 python 和 pandas 将错误创建的大型 csv 文件转换为制表符分隔文件

我们有许多 EBCDIC 格式的大型机文件,Python 中有没有办法将大型机文件解析或转换为 csv 文件或文本文件?

无法将 .json 文件从 CSV 下载到 JSON 转换并且无法将 JSON 转换为 CSV

csv转换obj