2016-08-02 12 views
0

fast-csvfromPath()メソッドを使用して、ファイルからデータを読み込んでいます。私はこのデータを配列に書きたいと思います。私は以下のコードは、この目的のために働くことを期待するが、それはしていません:ファーストcsvでファイルを読み込んで配列に書き込む

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

var dataArr = []; 
csv.fromPath("datas.csv", {headers: true}) 
.on("data", data => { 
    console.log(data); 
    // > { num: '4319', year: '1997', month: '4', day: '20', ... 
    dataArr.push(data); 
}); 
console.log(dataArr); 
// > [] 

が、私はこのコードのファイル内のデータを読み取ることができていますが、配列が移入されません。

これを達成するにはどうすればよいでしょうか、上記のコードがうまくいかないのはなぜですか?

答えて

1

「データ上の」コールバックが非同期であり、かつコールバックに続くコマンドは、コールバックが終了する前に実行されます。これがコードが機能しない理由であり、この推論は回答とコメントを投稿した他の人によって指摘されています。

タスクを達成するための良い方法として、私は"最後に"コールバックを使用することが適切であることを発見しました。ここでの意図は、ファイルが完全に読み込まれた後で、データ全体を「何か」することであるからです。

var dataArr = []; 
csv.fromPath("datas.csv", {headers: true}) 
.on("data", data => { 
    dataArr.push(data); 
}) 
.on("end",() => { 
    console.log(dataArr.length); 
    // > 4187 
}); 
+0

この回答は2016年12月からありがとう – swyx

2

モジュールの "on data"コールバックは非同期です。したがって、この行

console.log(dataArr); 

コールバックの前に実行されるため、常に空を返します。

この問題を解決するには、配列を処理してコールバック内でソートする必要があります。たとえば、次のように

var dataArr = []; 
csv.fromPath("datas.csv", {headers: true}) 
    .on("data", data => { 
     dataArr.push(data); 

     var sorted = _.sortBy(dataArr, 'propertyX'); 
     // do something with 'sorted' 
}); 
関連する問題