Sam*_*uel 7 asynchronous node.js 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);
}
Run Code Online (Sandbox Code Playgroud)
我从这里得到了这个代码。但我是 node js 的新手,所以我不知道如何在await所有行都被解析后获取数据。
const csvData = await this.util.readCSVData(path)
Run Code Online (Sandbox Code Playgroud)
HMa*_*gdy 13
我执行此任务的最佳解决方法是:
const csv = require('csvtojson')
const csvFilePath = 'data.csv'
const array = await csv().fromFile(csvFilePath);
Run Code Online (Sandbox Code Playgroud)
这个答案提供了使用async library 的遗留代码。基于 Promise 的控制流async不需要这个库。异步处理async.eachSeries在csv-parse回调内部没有很好的用途,因为回调等待data填充所有收集的数据。
如果将所有数据读入内存不是问题,CSV 流可以转换为承诺:
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');
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
14110 次 |
| 最近记录: |