我有一个csv文件列表,想解析它们。为此我导入了fast-csv。我尝试实现另一个stack overflow thread中描述的功能。
但是在我的代码中它不起作用,我真的很困惑为什么它不起作用。我总是得到一个空数组作为log(data)
的输出。
import { ParserOptionsArgs, parseFile } from '@fast-csv/parse'
import fs from 'fs'
import path from 'path'
var files: string[] = []
fs.readdirSync(inArg).forEach((file) => {
files.push(path.parse(file).name)
})
files.forEach( async(file) => {
const data: any = await readCsv(`${inArg}/${file}.csv`, { headers: true }, (row) => {})
log(data)
// here I want make some useful with the data
})
function readCsv(path: string, options: ParserOptionsArgs | undefined, rowProcessor: (arg0: any) => any) {
return new Promise((resolve) => {
const data: any = []
parseFile(path, options)
.on('data', (row: any) => {
const obj = rowProcessor(row)
if (obj) {
data.push(obj)
log(obj)
}
})
.on('end', () => {
resolve(data)
log('Done')
})
})
}
控制台输出:
Files: [ 'test1', 'test2', 'test3', 'test4' ]
Done
[]
Done
[]
Done
[]
Done
[]
有人能帮我吗?
1条答案
按热度按时间rseugnpd1#
您的
async/await
代码没有问题。**但是:**您正在传递一个rowProcessor
函数,该函数的到
readCsv
。这个rowProcessor
不返回任何东西。我知道这是一个微妙的陷阱,我不止一次偶然发现这个问题。但是上面是这样写的,{}
没有定义一个对象,而是一个空函数体。如果你真的想返回一个空对象,你的rowProcessor
应该或
现在,由于行处理器不返回任何内容,在下面的代码段中
obj
当然将始终为undefined
,因此,没有任何内容被推送到data
数组,因此log(data)
将记录空数组,我们看到。