Как получить результат после разбора csv с помощью csv-parser?

Я анализирую огромный 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.info(output)

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

Выход console.info(output) всегда представляет собой пустой массив. Пожалуйста, помогите мне решить эту проблему.

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

Это выглядит асинхронно. Попробуйте переместить console.info(output) внутрь function(err, csvLine){} сразу после цикла for.

adiga 02.02.2019 10:46
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
0
1
486
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Из-за асинхронности. Строка console.info(выход) выполняется после объявления переменной парсера. В это время выходная переменная не имеет в нем значений.

Вы должны получить доступ к выходная переменная после цикла, когда все данные считываются из 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.info(output)
    }); 
    fs.createReadStream('file.csv', {
       encoding: 'utf8'
    }).pipe(parser);

Спасибо @мукеш. Это сработало. console.info() всегда должен быть на уровне функции. То же самое, когда мы читаем несколько файлов?

csvb 02.02.2019 13:02

Используйте 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
}

Другие вопросы по теме