在不读取整个流的情况下获取CSV标头

时间:2019-06-13 19:57:04

标签: node.js fs node-csv-parse

我正在使用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}`)
            })          
    });
}

1 个答案:

答案 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();
       });
    });
}

尚未检查,如果有问题请发表评论。