有没有办法在node.js中同步读取CSV?

问题描述 投票:0回答:2

我正在使用

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;

如您所见,我需要导出“城市”数组。现在它返回空值(初始化值)。

javascript node.js csv
2个回答
3
投票

csv-parser
似乎总是异步的,所以你运气不好。

如果

data.csv
不经常更改,我建议将其解析为 JSON 一次,然后直接
require
JSON。

否则,您可以自己实现同步 CSV 解析,或者重构代码以等待异步解析完成,然后再继续处理该数据。


0
投票

如果您使用异步函数,您可以使用 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);
最新问题
© www.soinside.com 2019 - 2025. All rights reserved.