web-dev-qa-db-ja.com

図書館の推薦:csvファイルを読んでいるNodeJs

Nodejsでは、10000レコードの.csvファイルを解析して、各行に対して何らかの操作を行います。私は http://www.adaltas.com/projects/node-csv を使ってみました。私はこれを各行で一時停止させることができなかった。これだけですべての10000レコードを読みます。私は以下のことをする必要があります

  1. 1行ずつcsvを読む
  2. 各行で時間のかかる操作を実行する
  3. 次の行に行く

誰かがここで何か他のアイデアを提案できますか?

89
lonelymo

何らかのストリームベースのソリューションを使用する必要があるように思われます。すでにそのようなライブラリが存在していたので、自分自身を再発明する前に、このライブラリを試してください。これには検証サポートも含まれます。 https://www.npmjs.org/package/fast-csv

68
Risto Novik

私の現在の解決策は、直列に実行するためにasyncモジュールを使用します。

var fs = require('fs');
var parse = require('csv-parse');
var async = require('async');

var inputFile='myfile.csv';

var parser = parse({delimiter: ','}, function (err, data) {
  async.eachSeries(data, function (line, callback) {
    // do something with the line
    doSomething(line).then(function() {
      // when processing finishes invoke the callback to move to the next one
      callback();
    });
  })
});
fs.createReadStream(inputFile).pipe(parser);
48
prule

私はこのように使った: -

var fs = require('fs'); 
var parse = require('csv-parse');

var csvData=[];
fs.createReadStream(req.file.path)
    .pipe(parse({delimiter: ':'}))
    .on('data', function(csvrow) {
        console.log(csvrow);
        //do something with csvrow
        csvData.Push(csvrow);        
    })
    .on('end',function() {
      //do something wiht csvData
      console.log(csvData);
    });
42
vineet

参照しているnode-csvプロジェクトは、次の場所にあるドキュメントから、CSVデータの大部分の各行を変換するタスクには十分です。 http://csv.adaltas.com/transform/ =:

csv()
  .from('82,Preisner,Zbigniew\n94,Gainsbourg,Serge')
  .to(console.log)
  .transform(function(row, index, callback){
    process.nextTick(function(){
      callback(null, row.reverse());
    });
});

私の経験から、これもかなり速い実装であると言えるでしょう。私はこれを10kレコード近くのデータセットに取り組んできました、そして処理時間はセット全体に対して妥当な数十ミリ秒レベルでした。

jurkaのストリームベースの解決策の提案:node-csv IS stream basedおよびNode.jsのストリーミングAPIに従います。

10
krwck

fast-csv でストリーミングを一時停止するには、次のようにします。

let csvstream = csv.fromPath(filePath, { headers: true })
    .on("data", function (row) {
        csvstream.pause();
        // do some heavy work
        // when done resume the stream
        csvstream.resume();
    })
    .on("end", function () {
        console.log("We are done!")
    })
    .on("error", function (error) {
        console.log(error)
    });
8
adnan kamili

Fast-CSV npmモジュールはcsvファイルから1行ずつデータを読み取ることができます。

これが一例です。

let csv= require('fast-csv');

var stream = fs.createReadStream("my.csv");

csv
 .fromStream(stream, {headers : true})
 .on("data", function(data){
     console.log('I am one line of data', data);
 })
 .on("end", function(){
     console.log("done");
 });
  • この解決策は、上記のいくつかの答えで使用されているcsv-parserの代わりにcsv-parseを使用します。
  • csv-parsercsv-parseの2年後に登場しました。
  • どちらも同じ目的を解決しますが、個人的にはcsv-parserのほうがヘッダーを処理するのが簡単なので見つけました。

最初にcsv-parserをインストールしてください。

npm install csv-parser

だからあなたはこのようなCSVファイルがあるとします。

NAME, AGE
Lionel Messi, 31
Andres Iniesta, 34

必要な操作は次のように実行できます。

const fs = require('fs'); 
const csv = require('csv-parser');

fs.createReadStream(inputFilePath)
.pipe(csv())
.on('data', function(data){
    try {
        console.log("Name is: "+data.NAME);
        console.log("Age is: "+data.AGE);

        //perform the operation
    }
    catch(err) {
        //error handler
    }
})
.on('end',function(){
    //some final operation
});  

さらに読むために 参照

6
Pransh Tiwari

私は非同期csvリーダーを必要としていて、もともと@Pransh Tiwariの答えを試してみましたが、awaitutil.promisify()ではうまく動かせませんでした。結局私は node-csvtojson に出会いました。これはcsv-parserとほとんど同じですが、約束があります。これがcsvtojsonの使用例です。

const csvToJson = require('csvtojson');

const processRecipients = async () => {
    const recipients = await csvToJson({
        trim:true
    }).fromFile('./recipients.csv');

    // Code executes after recipients are fully loaded.
    recipients.forEach((recipient) => {
        console.log(recipient.name, recipient.email);
    });
};
3
alexkb

行npmプラグインで行を試してください。

npm install line-by-line --save
2
nickast

これは外部のURLからCSVファイルを取得するための私の解決策です

const parse = require( 'csv-parse/lib/sync' );
const axios = require( 'axios' );
const readCSV = ( module.exports.readCSV = async ( path ) => {
try {
   const res = await axios( { url: path, method: 'GET', responseType: 'blob' } );
   let records = parse( res.data, {
      columns: true,
      skip_empty_lines: true
    } );

    return records;
 } catch ( e ) {
   console.log( 'err' );
 }

} );
readCSV('https://urltofilecsv');
1

await/asyncでこのタスクを実行するための回避策:

const csv = require('csvtojson')
const csvFilePath = 'data.csv'
const array = await csv().fromFile(csvFilePath);
0
HMagdy

あなたはcsv-to-jsonモジュールを使ってcsvをjsonフォーマットに変換することができます、そして、あなたは簡単にあなたのプログラムでjsonファイルを使うことができます

0
Anuj Kumar
fs = require('fs');
fs.readFile('FILENAME WITH PATH','utf8', function(err,content){
if(err){
    console.log('error occured ' +JSON.stringify(err));
 }
 console.log('Fileconetent are ' + JSON.stringify(content));
})
0
swapnil