6

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

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

Node.js 中的大型 CSV 到 JSON/对象

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

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

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

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

有任何想法吗?

4

5 回答 5

16

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

很抱歉,它对您不起作用,这是由几个月前解决的错误引起的。我还在 README 中为您的场景添加了一些额外的行。请查看在命令行中处理大 CSV 文件

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

您可以通过运行更新它

npm install -g csvtojson

安装最新的 csvtojson后,您只需要运行:

csvtojson [path to bigcsvdata] > converted.json

这会从 csvfile 流式传输数据。或者,如果您想从另一个应用程序流式传输数据:

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

他们将输出相同的东西。

我已经使用超过 300 万条记录的 csv 文件对其进行了手动测试,并且它可以正常工作。

我相信你只需要一个简单的工具。lib的目的就是像这样缓解压力。下次遇到问题请务必告诉我,以便我及时解决。

于 2014-03-29T20:50:04.197 回答
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();
 });

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

于 2013-09-12T20:54:42.433 回答
2

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

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

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

这很可行,pipe并且中间有自己的管道,它将将行转换为要写入新文件的对象。

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

于 2013-09-12T09:46:49.977 回答
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 );
于 2018-04-16T09:55:11.240 回答
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(']')
于 2018-11-07T04:19:51.527 回答