我正在使用
csv-parser
lib 解析 Node.js 中的 CSV。但我需要解析的数据在整个项目中可用,而不仅仅是在“fs”部分。我知道有 fs.readFileSync
选项,但它没有用,因为 CSV 是二进制文件(至少在 node.js 解释中)。我该怎么办?
const csv = require("csv-parser");
const fs = require("fs");
const cities = [];
let content = fs.createReadStream('data.csv')
.pipe(csv())
.on('data', (row) => {
cities.push(row);
});
var city_data = {
createArrayId: function(){
console.log(cities);
return cities;
}
}
module.exports = city_data;
如您所见,我需要导出“城市”数组。现在它返回空值(初始化值)。
csv-parser
似乎总是异步的,所以你运气不好。
如果
data.csv
不经常更改,我建议将其解析为 JSON 一次,然后直接 require
JSON。
否则,您可以自己实现同步 CSV 解析,或者重构代码以等待异步解析完成,然后再继续处理该数据。
如果您使用异步函数,您可以使用 Promise 包装对 csv-parser 的调用,然后使用 wait 等待它完成,然后再转到下一个任务。 以下是如何操作的示例:
const fs = require('fs');
const csv = require('csv-parser');
async function readCsv(csvFileName) {
function doParse(resolve) {
const results = [];
fs.createReadStream(csvFileName)
.pipe(csv())
.on('data', data=>results.push(data))
.on('end', () => {
resolve(results);
});
}
return new Promise((resolve) => doParse(resolve));
}
async function main(argv) {
console.log("BEGIN...\n");
let results = await readCsv(argv[2]);
for (let i = 0; i < results.length; ++i)
console.log(results[i]);
console.log("\n...END");
}
main(process.argv);