15

私は、達成するのがかなり簡単であるだけでなく、それを実行するための簡単なパッケージが利用できるほど一般的なタスクであるように思われることをしようとしています. 大きな CSV ファイル (リレーショナル データベース テーブルからのエクスポート) を取り、それを JavaScript オブジェクトの配列に変換したいと考えています。.jsonさらに、ファイルフィクスチャにエクスポートしたいと思います。

CSV の例:

a,b,c,d
1,2,3,4
5,6,7,8
...

必要な JSON:

[
{"a": 1,"b": 2,"c": 3,"d": 4},
{"a": 5,"b": 6,"c": 7,"d": 8},
...
]

いくつかのノード CSV パーサー、ストリーマー、自称 CSV-to-JSON ライブラリを試しましたが、必要な結果が得られないようです。または、できるとしても、ファイルが小さい場合にのみ機能します。私のファイルのサイズは約 1 GB で、行数は最大 4,000 万行です (4,000 万個のオブジェクトが作成されます)。メモリの問題を回避するには、入力や出力をストリーミングする必要があると思います。

試したパッケージは次のとおりです。

私は Node 0.10.6 を使用していますが、これを簡単に達成する方法についての推奨事項が欲しいです。自分で開発するのがベストかもしれませんが、特に 0.10.x で API が変更されたため、Node のすべてのストリーミング機能をどこから始めればよいかわかりません。

4

6 に答える 6

8

ライブラリ、コマンド ライン ツール、または Web サーバー プラグインとして使用できる node.js csvtojson モジュールを確認します。https://www.npmjs.org/package/csvtojson . ソースコードは https://github.com/Keyang/node-csvtojsonにあります。

または NPM リポジトリからインストールします。

npm install -g csvtojson

任意のサイズの csv データ / フィールド タイプ / ネストされた json などをサポートします。多数の機能。

var Converter=require("csvtojson").core.Converter;

var csvConverter=new Converter({constructResult:false, toArrayString:true}); // The constructResult parameter=false will turn off final result construction in memory for stream feature. toArrayString will stream out a normal JSON array object.

var readStream=require("fs").createReadStream("inputData.csv"); 

var writeStream=require("fs").createWriteStream("outpuData.json");

readStream.pipe(csvConverter).pipe(writeStream);

cli ツールとしても使用できます。

csvtojson myCSVFile.csv
于 2013-06-19T13:13:36.270 に答える
3

csvtojson を使用して csv データを読み取るためのより簡単な方法を見つけました。

コードは次のとおりです。

var Converter = require("csvtojson").Converter;
var converter = new Converter({});
converter.fromFile("sample.csv",function(err,result){
  var csvData = JSON.stringify
  ([
    {resultdata : result[0]},
    {resultdata : result[1]},
    {resultdata : result[2]},
    {resultdata : result[3]},
    {resultdata : result[4]}
  ]);
  csvData = JSON.parse(csvData);
  console.log(csvData);
});

または、これを簡単に行うことができます:

var Converter = require("csvtojson").Converter;
var converter = new Converter({});
converter.fromFile("sample.csv",function(err,result){ 
  console.log(result);
});

最初のコードの結果は次のとおりです。

[ { resultdata: 
     { 'Header 1': 'A_1',
       'Header 2': 'B_1',
       'Header 3': 'C_1',
       'Header 4': 'D_1',
       'Header 5': 'E_1' } },
  { resultdata: 
     { 'Header 1': 'A_2',
       'Header 2': 'B_2',
       'Header 3': 'C_2',
       'Header 4': 'D_2',
       'Header 5': 'E_2' } },
  { resultdata: 
     { 'Header 1': 'A_3',
       'Header 2': 'B_3',
       'Header 3': 'C_3',
       'Header 4': 'D_3',
       'Header 5': 'E_3' } },
  { resultdata: 
     { 'Header 1': 'A_4',
       'Header 2': 'B_4',
       'Header 3': 'C_4',
       'Header 4': 'D_4',
       'Header 5': 'E_4' } },
  { resultdata: 
     { 'Header 1': 'A_5',
       'Header 2': 'B_5',
       'Header 3': 'C_5',
       'Header 4': 'D_5',
       'Header 5': 'E_5' } } ]

このコードのソースは https://www.npmjs.com/package/csvtojson#installationにあります。

アイデアが得られたことを願っています。

于 2016-03-04T03:58:31.020 に答える
1

大きなファイルを処理できるように、ストリームを使用できます。これがあなたがする必要があることです。これで問題なく動作するはずです。

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:49:42.530 に答える