将大型 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应该没问题。 我正在使用 clicsvtojson --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 文件或文本文件?