Как получить вывод после разбора CSV с помощью CSV-Parser? - PullRequest
0 голосов
/ 02 февраля 2019

Я анализирую огромный CSV (1,2 ГБ) с помощью csvparser и пытаюсь получить определенные данные столбца из проанализированного 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) всегда является пустым массивом.Пожалуйста, помогите мне решить это.

Я попытался понять пост здесь - Сохранить вывод csv-parse в переменную .Но я не смог понять и исправить код.

Ответы [ 2 ]

0 голосов
/ 28 марта 2019

Используйте 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
}
0 голосов
/ 02 февраля 2019

Из-за асинхронности. Строка 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);
...