Nodejsでは、10000レコードの.csvファイルを解析して、各行に対して何らかの操作を行います。私は http://www.adaltas.com/projects/node-csv を使ってみました。私はこれを各行で一時停止させることができなかった。これだけですべての10000レコードを読みます。私は以下のことをする必要があります
誰かがここで何か他のアイデアを提案できますか?
何らかのストリームベースのソリューションを使用する必要があるように思われます。すでにそのようなライブラリが存在していたので、自分自身を再発明する前に、このライブラリを試してください。これには検証サポートも含まれます。 https://www.npmjs.org/package/fast-csv
私の現在の解決策は、直列に実行するために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);
私はこのように使った: -
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);
});
参照している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に従います。
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)
});
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-parser
はcsv-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
});
さらに読むために 参照
私は非同期csvリーダーを必要としていて、もともと@Pransh Tiwariの答えを試してみましたが、await
とutil.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);
});
};
行npmプラグインで行を試してください。
npm install line-by-line --save
これは外部の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');
await/asyncでこのタスクを実行するための回避策:
const csv = require('csvtojson')
const csvFilePath = 'data.csv'
const array = await csv().fromFile(csvFilePath);
あなたはcsv-to-jsonモジュールを使ってcsvをjsonフォーマットに変換することができます、そして、あなたは簡単にあなたのプログラムでjsonファイルを使うことができます
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));
})