Node.js fast-csv同步读取文件和return数组
Node.js fast-csv synchronously read file and return array
我正在尝试读取 .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;
});
但是fast-csv
读取的文件是一个流,所以我只能逐行处理。
我需要在一秒钟内使用完整的数组来调用一些 API 服务,因此我想同步读取文件,附加行,并在最后返回数组,这样,在一秒钟内,我可以将前面的代码包裹在一个函数中,通过如下方式获取数组:
const data = readCSVSynchronously()
如何使用 fast-csv
完成?
您不能将异步函数变成同步函数。
但是,您可以将那些多事的阅读代码包装成一个承诺,然后您可以在 a promise/async
context 中使用它,如下所示:
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...
}
回调函数可以用 promise 包装。
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();
我正在尝试读取 .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;
});
但是fast-csv
读取的文件是一个流,所以我只能逐行处理。
我需要在一秒钟内使用完整的数组来调用一些 API 服务,因此我想同步读取文件,附加行,并在最后返回数组,这样,在一秒钟内,我可以将前面的代码包裹在一个函数中,通过如下方式获取数组:
const data = readCSVSynchronously()
如何使用 fast-csv
完成?
您不能将异步函数变成同步函数。
但是,您可以将那些多事的阅读代码包装成一个承诺,然后您可以在 a promise/async
context 中使用它,如下所示:
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...
}
回调函数可以用 promise 包装。
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();