问题描述
当前,我正在尝试创建一个可以处理非常大的CSV文件的CSV阅读器。我选择使用事件流NPM包进行流式实施。
我创建了一个getNextp()函数,该函数应返回一个promise并在每次调用它时给我下一个数据。
"use strict";
const fs = require('fs');
const es = require('event-stream');
const csv = require('csv-parser');
class CsvFileReader {
constructor(file) {
this.file = file;
this.isstreamReading = false;
this.stream = undefined;
}
getNextP() {
return new Promise( (resolve) => {
if (this.isstreamReading === true) {
this.stream.resume();
} else {
this.isstreamReading = true;
// Start reading the stream.
this.stream = fs.createReadStream(this.file)
.pipe(csv())
.pipe(es.mapSync( (row) => {
this.stream.pause();
resolve(row);
}))
.on('error',(err) => {
console.error('Error while reading file.',err);
})
.on("end",() => {
resolve(undefined);
})
}
});
}
}
然后我用这段代码称呼它。
const csvFileReader = new CsvFileReader("small.csv");
setInterval( () => {
csvFileReader.getNextP().then( (frame) => {
console.log(frame);
})
},1000);
但是,每次我尝试时,我只会得到第一行,而我不会得到后续的行。我不知道为什么这不起作用。我已经尝试过使用一个好的旧回调函数进行同样的操作,然后它可以正常工作。
更新: 所以我基本上想要的是一个函数(getNext()),每次我将其称为CSV的下一行时,它都会返回我。某些行可以缓冲,但是是的,直到现在,我仍无法弄清楚如何使用流。因此,如果有人可以给我一个如何创建正确的getNext()函数的指针,那将是很棒的。
我想问问是否有人了解这里出了什么问题,并恳请分享他/她的知识。
谢谢。
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)