我正在使用fast-csv的fromPath()
方法从文件中读取数据。我想将这些数据写入一个数组(我将在后面对其进行排序)。我希望下面的代码可以用于此目的,但它不会:
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);
// > []
我能够使用此代码读取文件中的数据,但未填充数组。
实现这一目标的好方法是什么,为什么上面的代码不起作用?
答案 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)