在 NodeJS 中读取 CSV

Reading from a CSV in NodeJS

问题

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']

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

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

(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);
    });
    
})();