首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Node.js fast-csv同步读取文件并返回数组

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

Stack Overflow用户
提问于 2020-11-23 20:15:38
回答 2查看 1.1K关注 0票数 3

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

代码语言:javascript
复制
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;
  });

但是,fast-csv读取的文件是一个流,因此我只能逐行处理。我需要在第二个瞬间使用完整的数组来调用一些API服务,因此我希望同步读取文件,添加每一行,并在最后返回数组,这样,在第二个瞬间,我就可以将前面的代码包装在一个函数中,并以如下方式获得该数组:

const data = readCSVSynchronously()

如何使用fast-csv完成此操作?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-11-23 20:21:19

您不能将异步函数转换为同步函数。

但是,您可以将这些事件读取代码封装到promise中,然后可以在a promise/async context中使用它,如下所示:

代码语言:javascript
复制
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...
}
票数 4
EN

Stack Overflow用户

发布于 2020-11-23 20:22:05

回调函数可以用promise包装。

代码语言:javascript
复制
const fs = require("fs");
const csv = require("@fast-csv/parse");

let data = []
let readCSVSynchronously = async () = {

    return new Promise(reject, resolve => {
     const results = [];
     csv
      .parseFile("./downloads/aggiornamento.csv", { skipRows: 2 })
      .on("error", (error) => console.error(error)
          return reject(error);
       )
      .on("data", (row) => {
        // Do your logic
        results.push(row);
      })
      .on("end", function () {
          resolve(results)
      });
    });
}

const totalResults = await readCSVSynchronously();
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64968247

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档