【问题标题】:Reading from a CSV in NodeJS在 NodeJS 中读取 CSV
【发布时间】:2021-02-07 22:41:25
【问题描述】:

问题

createReadStream 中的 push() 函数不会将我的数据推送到数组中。

代码

let csv = require('csv-parser');

let people = [];

let final_array = [];

fs.createReadStream('people.csv')
      .pipe(csv())
      .on('data', (data) => {
        people.push(data)
      })
      .on('end', () => {
        console.log(people) //This prints out people fine
      })

console.log(people) //This returns empty array

people.forEach((names) => {
    console.log(people[names]); //absolutely no output
})

输出

[] //Output for console.log(people) outside the createReadStream

//Output for console.log  people inside the createReadStream
[
  { username: 'rezero' },
  { username: 'software' },
  { username: 'planets' },
  { username: 'darkseid' },
  { username: 'gintama' },
  { username: 'websines' },
  { username: 'digital' }
]

期望的输出

我只希望数据中的用户名进入我的 final_array 以执行进一步的任务。

final_array = ['rezero','software','planets','darkseid','gintama','websines','digital']

【问题讨论】:

    标签: node.js csv fs


    【解决方案1】:

    csv 解析将异步运行,这意味着console.log(people)(以及之后的代码)将在文件完全解析之前运行。

    您可以将解析包装成一个 Promise 并等待这个 Promise(这仍然需要错误处理,但应该给您一个想法):

    (async () => {
        let peopleData = [];
        await new Promise(resolve => {
            fs.createReadStream('people.csv')
                .pipe(csv())
                .on('data', (data) => {
                    peopleData.push(data)
                })
                .on('end', () => {
                    resolve();
                })
        });
        const finalArray = peopleData.map(data => data.username);
        finalArray.forEach(name => {
          console.log(name);
        });
        
    })();
    

    【讨论】:

    • 谢谢你,你能帮我把对象循环成所需的输出吗?
    • 当然 - 我已经用简单的.map() 更新了答案,请检查。
    猜你喜欢
    • 1970-01-01
    • 2019-01-13
    • 1970-01-01
    • 2018-01-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-07-16
    相关资源
    最近更新 更多