2016-08-02 86 views
0

我正在使用fast-csvfromPath()方法從文件中讀取數據。我想將這些數據寫入一個數組(我將隨後進行排序)。我希望下面的代碼達到這個目的,但它並不:使用fast-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' 
});