Node.js fast-csv 同步读取文件并返回数组

san*_*nna 12 node.js fast-csv

我正在尝试读取 .csv 文件并使用以下代码将其分配给数组:

const fs = require("fs");
const csv = require("@fast-csv/parse");

let data = []

csv
  .parseFile("./downloads/aggiornamento.csv", { skipRows: 2 })
  .on("error", (error) => console.error(error))
  .on("data", (row) => {
    let obj = {};
    obj["item_id"] = row[2];
    obj["qty"] = row[20];

    data.push(obj);
    console.log(obj);
  })
  .on("end", function () {
    return data;
  });
Run Code Online (Sandbox Code Playgroud)

但是,读取的文件fast-csv是流,因此我只能逐行处理。我需要在第二个时刻调用一些 API 服务的完整数组,因此我想同步读取文件,追加每一行,并在最后返回数组,这样,在第二个时刻,我可以包装上一个在函数中编写代码,并以如下方式获取数组:

const data = readCSVSynchronously()

我怎样才能做到这一点fast-csv

AKX*_*AKX 19

您无法将异步函数转变为同步函数。

但是,您可以将多事的阅读代码包装到一个 Promise 中,然后可以在Promise/ asynccontext中使用它,如下所示:

const fs = require("fs");
const csv = require("@fast-csv/parse");

function readCsv(path, options, rowProcessor) {
  return new Promise((resolve, reject) => {
    const data = [];

    csv
      .parseFile(path, options)
      .on("error", reject)
      .on("data", (row) => {
        const obj = rowProcessor(row);
        if (obj) data.push(obj);
      })
      .on("end", () => {
        resolve(data);
      });
  });
}

async function doThings() {
  const data = await readCsv(
    "./downloads/aggiornamento.csv",
    { skipRows: 2 },
    (row) => ({ item_id: row[2], qty: row[20] }),
  );
  // use data in API...
}
Run Code Online (Sandbox Code Playgroud)