Получение заголовков CSV без чтения всего потока
Я использую csv-parser
модуль узла для захвата заголовков потоковых CSV-файлов; Я использую источник событий 'headers', который встроен в модуль.
Я перебираю массив csv readstreams, которые я прохожу через мой getHeaders()
функция. Сразу после захвата заголовков потокового 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}`)
})
});
}
1 ответ
Как насчет чтения первых двух строк потока, а затем передачи массива в 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();
});
});
}
Не проверял, прокомментируйте если что не так.