【问题标题】:How to obtain the output after parsing the csv using csv-parser?使用 csv-parser 解析 csv 后如何获取输出?
【发布时间】:2019-02-02 09:42:41
【问题描述】:

我正在使用 csvparser 解析一个巨大的 csv (1.2GB) 并尝试从解析的 csv 中获取某些列数据。我试图在处理后将数据推送到数组,但只得到空数组作为输出。如何修复此代码?

var parse = require('csv-parse');

var output = []
var parser = parse({
   delimiter: '\t',
   columns: true
}, function(err, csvLine) {
   for (var l = 0; l < csvLine.length; l++) {
      output.push(csvLine[l].id)
   }
});

console.log(output)

fs.createReadStream('file.csv', {
   encoding: 'utf8'
}).pipe(parser);

console.log(output) 的输出始终是一个空数组。请帮我解决这个问题。

我试图理解这里的帖子 - Save csv-parse output to a variable。但我无法理解和修复代码。

【问题讨论】:

  • 看起来是异步的。尝试在 function(err, csvLine){} 内移动 console.log(output) 就在 for 循环之后

标签: javascript node.js stream output node-csv-parse


【解决方案1】:

因为异步。 console.log(output) 行在解析器变量声明之后运行。那时输出变量里面没有值。

当从 csv 读取所有数据时,您必须在循环后访问 输出变量,如下所示。

    var parse = require('csv-parse');
    var fs = require('fs');
    var output = []
    var parser = parse({
       delimiter: ',',
       columns: true
    }, function(err, csvLine) {
       for (var l = 0; l < csvLine.length; l++) {
          output.push(csvLine[l].visitortype)
       }
       console.log(output)
    }); 
    fs.createReadStream('file.csv', {
       encoding: 'utf8'
    }).pipe(parser);

【讨论】:

  • 谢谢@mukesh。这行得通。 console.log() 应该始终处于函数级别。读取多个文件也是一样吗?
【解决方案2】:

使用fast-csv将文件解析为ReadableStream,然后使用异步迭代(for await)逐行处理。它更简单。

const csv = require("fast-csv")

let myList=[];

const csvStream = csv.fromPath(filename);
for await(const row of csvStream) {
    myList.push(row[1]); // get the second column
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-08-27
    • 1970-01-01
    • 2014-08-11
    • 2023-03-10
    • 2015-10-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多