如何用异步数据读写CSV?

ilmyapht  于 2023-03-10  发布在  其他
关注(0)|答案(1)|浏览(131)

我正在尝试读取CSV,用一些外部API丰富数据,然后编写一个新的CSV。
我的问题是要等到所有的调用API已经完成之前写CSV。到目前为止,我写了每一行,但最后一行-结束事件触发器“太早”,它不等待我的最后一个调用完成。
我是这么做的:

const stream = await fs
  .createReadStream('./foo.csv')
  .pipe(parse({ delimiter: ',', from_line: 2 }))
  .on('data', async function (row) {
    try {
      stream.pause()
      const foo1 = row[0]
      const foo2 = await externalAPI(row[1])
      const newRow = [foo1, foo2]
      data.push(newRow)
    } finally {
      stream.resume()
    }
  })
  .on('end', function () {
     stringify(data, (err, output) => {
         fs.writeFileSync('demoA.csv', output)
     })

  })
  .on('error', function (error) {
    console.log(error.message)
  })
zz2j4svz

zz2j4svz1#

只需完全读取csv文件,调用外部API,然后将输出写入新的csv文件。

const rows = await new Promise((resolve, reject) => {
  const data = [];
  fs
  .createReadStream('./foo.csv')
  .pipe(parse({ delimiter: ',', from_line: 2 }))
  .on('data', (row) => data.push(row)) // collect row
  .on('end', () => resolve(data)) // return data
  .on('error', (error) => reject(error))
});

const newRows = [];
for (const [col0, col1] of rows) {
  const newCol = await externalAPI(col1); // wait for external api call
  newRows.push([col0, newCol]);
}

stringify(newRows, (err, output) => {
  fs.writeFileSync('demoA.csv', output)
});

相关问题