2016-08-02 85 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' 
});