我正在使用csv-parser
节点模块来捕获流式csv文件的标题;我正在使用一个“标题”事件发射器,它内置在模块中。
我正在遍历通过getHeaders()
函数传递的一组csv读取流。在捕获流式csv的标头之后,我想关闭该流,然后将下一个csv流传递到函数中,这样我就可以获取这些标头,然后关闭流,依此类推...
做到这一点的最佳方法是什么?我尝试了几种不同的方法,包括.destroy()
,但是我没有找到有效的解决方案。也许我试图在错误的位置关闭流?这就是我所拥有的:
function getHeaders(dataStream) {
return new Promise((resolve, reject) => {
dataStream
.pipe(csv())
.on('headers', (headers) => {
let headerArray = Array.prototype.slice.call(headers);
resolve(headerArray);
dataStream.destroy();
})
.on('error', (err) => {
reject(`err from readingFile ${err}`)
})
});
}
答案 0 :(得分:0)
先读取两行流,然后将数组作为可读流传递到csv,怎么样?
尝试一下:
const lineReader = require('readline');
const Stream = require('stream')
function getHeaders(dataStream) {
return new Promise((resolve, reject) => {
let wantedLines = [];
lineReader.createInterface({
input: dataStream
});
lineReader.on('line', (line) => {
if(wantedLines.length >= 2) {
lineReader.close();
}
});
lineReader.on('close', () => {
let resolved = false;
const readableStream = new Stream.Readable();
readableStream
.pipe(csv())
.on('headers', (headers) => {
if (!resolved) resolved = true;
resolve(headers);
})
.on('error', reject);
.on('close', () => {
if (!resolved) resolve([]);
});
wantedLines.forEach(line => readableStream.push(line));
readableStream.destroy();
});
});
}
尚未检查,如果有问题请发表评论。