使用fast-csv从文件读取并写入数组

时间:2016-08-02 19:03:56

标签: javascript csv

我正在使用fast-csvfromPath()方法从文件中读取数据。我想将这些数据写入一个数组(我将在后面对其进行排序)。我希望下面的代码可以用于此目的,但它不会:

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);
// > []

我能够使用此代码读取文件中的数据,但未填充数组。

实现这一目标的好方法是什么,为什么上面的代码不起作用?

4 个答案:

答案 0 :(得分:3)

"数据" 回调是异步的,回调后的命令将在回调结束前运行。这就是代码不起作用的原因,并且已经发布了答案和评论的其他人指出了这种推理。

至于完成任务的好方法,我发现使用"结束" 回调非常合适;因为这里的意图是做某事"在完整读取文件后,使用整个数据。

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

答案 1 :(得分:2)

"关于数据"模块的回调是异步的。因此,这一行

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'
});

答案 2 :(得分:2)

好吧,我知道这个问题已经问了很久,但是现在我开始使用CSV文件来创建带有节点js的API。作为一个典型的程序员,我用谷歌搜索“用fast-csv读取文件并写入数组”之类的东西,但是直到现在,对于该问题还没有任何适当的答案,因此我决定回答这个问题。

接下来是异步函数,因此执行将在主流中暂停,并且仅在执行非异步函数后才能恢复执行。

var querryParameter = ()=> new Promise( resolve =>{
   let returnLit = []
   csv.fromPath("<fileName>", {headers : true})
      .on('data',(data)=>{
          returnLit.push(data[<header name>].trim())
      })
      .on('end',()=>{
          resolve(returnLit)
      })
})
var mainList = [];
querryParameter().then((res)=>mainList = res)

如果要验证某些内容,请将参数传递给querryParameter()并在validate方法中使用该参数。

答案 3 :(得分:2)

从“ fast-csv”:“ ^ 4.1.3”开始,@ ChandraKumar的方法不再起作用

fromPath函数已取代“ parseFile”

var queryParameter = ()=> new Promise( resolve =>{
   let returnLit = []
   csv.parseFile("<fileName>", {headers : true})
      .on('data',(data)=>{
          returnLit.push(data[<header name>].trim())
      })
      .on('end',()=>{
          resolve(returnLit)
      })
})
var mainList = [];
queryParameter().then((res)=>mainList = res)