我正在使用 csv-parser
Node 模块来捕获流式 csv 文件的 header ;我正在使用模块中内置的“标题”事件发射器。
我正在循环遍历通过 getHeaders()
函数传递的 csv 读取流数组。在捕获流式 csv 的 header 后,我想关闭该流,然后将下一个 csv 流传递到函数中,以便我可以获得这些 header ,然后关闭流,依此类推...
最好的方法是什么?我尝试了几种不同的方法,包括 .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}`)
})
});
}
最佳答案
读取流的前两行,然后将数组作为可读流传输到 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();
});
});
}
尚未检查,如有错误请评论。
关于node.js - 获取 CSV header 而不读取整个 Stream,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56587753/