Node.js 在不读取整个流的情况下获取CSV头
我正在使用Node.js 在不读取整个流的情况下获取CSV头,node.js,fs,node-csv-parse,Node.js,Fs,Node Csv Parse,我正在使用csv解析器节点模块捕获流式csv文件的标题;我正在使用一个内置在模块中的“headers”事件发射器 我正在循环通过我的getHeaders()函数传递的csv读流数组。在我捕获流式csv的标题之后,我想关闭该流,然后将下一个csv流传递到函数中,这样我就可以获得这些标题,然后关闭流,依此类推 最好的方法是什么?我尝试了几种不同的方法,包括.destroy(),但我还没有找到一种有效的解决方案。也许我试图在错误的地点关闭溪流?以下是我所拥有的: function getHeaders
csv解析器
节点模块捕获流式csv文件的标题;我正在使用一个内置在模块中的“headers”事件发射器
我正在循环通过我的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}`)
})
});
}
如何读取流的前2行,然后将数组作为可读流传输到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();
});
});
}
未检查,如果有问题,请进行注释。如何读取流的前两行,然后将阵列作为可读流传输到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();
});
});
}
没有检查,如果有问题,请评论