Node.js中如何从路径数组生成Promise数组以批量异步处理CSV文件
实现方案
完整可运行代码
const fsPromises = require('fs').promises const parse = require('csv-parse/lib/sync') const fs = require('fs') // 读取目录下所有文件名,过滤仅保留.csv文件,拼接为完整路径 const csvFilePaths = fs.readdirSync(__dirname + '/testdata') .filter(fileName => fileName.endsWith('.csv')) .map(fileName => `${__dirname}/testdata/${fileName}`) // 生成读取+解析的Promise数组 const fileProcessPromises = csvFilePaths.map(filePath => { return fsPromises.readFile(filePath) .then(file => parse(file, { columns: ['Date', 'Name', 'Value'], relax_column_count: true, fromLine: 2, })) }) async function readDirectory() { try { const fileData = await Promise.all(fileProcessPromises) const fileDataFlattened = fileData.flat() console.log(fileDataFlattened) // 后续业务逻辑可在此处补充 } catch (err) { console.log('文件读取解析出错:', err) } } readDirectory()
关键逻辑说明
- 先对
readdirSync返回的文件名做过滤,只保留后缀为.csv的文件,避免目录下其他类型文件导致解析报错 - 通过
Array.map遍历每个符合要求的文件路径,每个路径都返回一个「读取文件+解析内容」的Promise实例,直接就能得到可传入Promise.all的批量任务数组 - 后续的结果扁平化、业务处理逻辑和你之前硬编码版本完全一致
可选优化(全异步实现)
如果不想用同步的readdirSync阻塞主线程,可以改成全异步逻辑:
const fsPromises = require('fs').promises const parse = require('csv-parse/lib/sync') async function readDirectory() { try { // 异步读取目录 const fileNames = await fsPromises.readdir(__dirname + '/testdata') const csvFilePaths = fileNames .filter(fileName => fileName.endsWith('.csv')) .map(fileName => `${__dirname}/testdata/${fileName}`) // 生成Promise数组并批量执行 const fileProcessPromises = csvFilePaths.map(filePath => fsPromises.readFile(filePath).then(file => parse(file, { columns: ['Date', 'Name', 'Value'], relax_column_count: true, fromLine: 2, })) ) const fileData = await Promise.all(fileProcessPromises) const fileDataFlattened = fileData.flat() console.log(fileDataFlattened) } catch (err) { console.log('出错:', err) } } readDirectory()
内容的提问来源于stack exchange,提问作者Eric
相关产品推荐
相关产品推荐

