异步读取csv文件-NodeJS

时间:2018-08-06 14:41:55

标签: node.js asynchronous async-await

我正在尝试创建一个函数,该函数可以传递文件路径并以异步方式读取文件。我发现它支持streams()

const fs = require('fs');
var parse = require('csv-parse');
var async = require('async');

readCSVData = async (filePath): Promise<any> => {
    let csvString = '';
    var parser = parse({delimiter: ','}, function (err, data) {
        async.eachSeries(data, function (line, callback) {
            csvString = csvString + line.join(',')+'\n';
            console.log(csvString) // I can see this value getting populated
        })
      });
      fs.createReadStream(filePath).pipe(parser);
}

我从here获得了这段代码。但是我是Node js的新手,因此一旦解析所有行后,我就无法使用await来获取数据。

const csvData = await this.util.readCSVData(path)

2 个答案:

答案 0 :(得分:2)

This answer提供了使用async 的旧代码。使用async的基于承诺的控制流不需要此库。在async.eachSeries回调中,使用csv-parse进行异步处理不是一个好目的,因为回调等待data充满所有收集的数据。

如果将所有数据读入内存都不成问题,则可以将CSV流转换为Promise:

const fs = require('fs');
const getStream = require('get-stream');
const parse = require('csv-parse');

readCSVData = async (filePath): Promise<any> => {
  const parseStream = parse({delimiter: ','});
  const data = await getStream.array(fs.createReadStream(filePath).pipe(parseStream));
  return data.map(line => line.join(',')).join('\n');
}

答案 1 :(得分:1)

对于此任务,我最好的解决方法是:

const csv = require('csvtojson')
const csvFilePath = 'data.csv'
const array = await csv().fromFile(csvFilePath);