1

我正在尝试node.js使用该csv-parser 库读取 CSV 文件。

由于它是一个大文件,我需要检查标题和第一100行并停止该方法并true在一切正常或false数据不符合条件时返回。

我怎样才能做到这一点?

这是我到目前为止所拥有的:

const csv = require('csv-parser');
const fs = require('fs');    
exports.checkFileFormat = (file) => {
  let stream = fs.createReadStream(file.tempFilePath)
    .pipe(csv())
    .on('headers', (headers) => {
      /*...some logic...*/
    })
    .on('data', (row) => {
      if (!typeof (row["USAGE"]) == 'number'
          || !moment(row["START_DATE"], 'YYYYMMDD', true).isValid()
          || !moment(row["END_DATE"], 'YYYYMMDD', true).isValid()) {
        stream.unpipe(csv());
        return false;
      }       
    })
    .on('end', () => {
       console.log('CSV file successfully processed');
    });
    return true;
}

在以前的版本中,我也声明过:var num = 100并在内部对其进行了测试,.on('data', (row) => {...}但它不起作用。

4

2 回答 2

2

跟进我的评论

使函数checkFileFormat 返回一个承诺。在 promise 内部,而resolve(false)不是在回调中。我不完全确定这会奏效,但这就是我将如何处理它return falseresolve(true)'.on('end')

const csv = require('csv-parser');
const fs = require('fs');

exports.checkFileFormat = (file) => {
    return new Promise((resolve, reject) => {
        let stream = fs.createReadStream(file.tempFilePath)
            .pipe(csv())
            .on('headers', (headers) => {
                /*...some logic...*/
            })
            .on('data', (row) => {
                if (!typeof (row["USAGE"]) == 'number'
                    || !moment(row["START_DATE"], 'YYYYMMDD', true).isValid()
                    || !moment(row["END_DATE"], 'YYYYMMDD', true).isValid()) {
                    stream.end(); // stream.unpipe(csv());
                    resolve(false);
                }
            })
            .on('end', () => {
                console.log('CSV file successfully processed');
                resolve(true);
            });
    });    
}
于 2020-12-07T15:37:34.970 回答
1

如果您想读取一定数量的行然后中断,您可以尝试以下操作:

const csv = require('csv-parser');
const fs = require('fs');
let count = 0;
let maxLines = 3;
let fsStream = fs.createReadStream('./data.csv');
let csvStream = csv();

fsStream.pipe(csvStream)
    .on('headers', (headers) => {
        console.log(headers)
    })
    .on('data', (data) => {
        if (count >= maxLines) {
            fsStream.unpipe(csvStream);
            csvStream.end();
            fsStream.destroy();             
        } else {
            console.log(data);
            count++;
        }
    });

基本上你只需计算每条读取线,当达到最大值时,你unpipe会从 fs-stream 中获取 csv-stream,然后end是 csv-stream,最后destroy是 fs-stream。

于 2020-12-07T15:39:22.523 回答