在 NodeJS 中读取 CSV

Posted

技术标签:

【中文标题】在 NodeJS 中读取 CSV【英文标题】:Reading from a CSV in NodeJS 【发布时间】: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']

【问题讨论】:

【参考方案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() 更新了答案,请检查。

以上是关于在 NodeJS 中读取 CSV的主要内容,如果未能解决你的问题,请参考以下文章

NodeJS:读取一个大的 csv 文件

nodejs读取csv

在 node.js 中读取 csv 文件的内容

NodeJS 在引导一个 csv 文件后崩溃

使用 NodeJS 解析 CSV 文件

NodeJs - 使用 fs.createReadStream 读取文件时出错