【问题标题】:Reading a csv file async - NodeJS异步读取 csv 文件 - NodeJS
【发布时间】:2019-01-13 13:33:58
【问题描述】:

我正在尝试创建一个函数,我可以在其中传递文件路径并以异步方式读取文件。我发现它支持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 获得此代码。但我是节点 js 的新手,所以我不知道如何在解析所有行后使用 await 获取数据。

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

【问题讨论】:

  • 对于 node js 旧版本(即 nodejs v4.2.0)是否存在任何承诺基础 csv 库

标签: node.js asynchronous async-await


【解决方案1】:

This answer 提供使用async 的旧代码。 async 的基于 Promise 的控制流不需要这个库。使用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');
}

【讨论】:

    【解决方案2】:

    我最好的解决方法是:

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

    【讨论】:

    • 这个答案帮助解决了我面临的问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-03-25
    • 2015-12-14
    • 2018-01-19
    • 2016-12-25
    • 2019-02-20
    • 2021-08-07
    相关资源
    最近更新 更多