Я анализирую огромный 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 в переменную. Но я не смог понять и исправить код.



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Из-за асинхронности. Строка 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() всегда должен быть на уровне функции. То же самое, когда мы читаем несколько файлов?
Используйте 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
}
Это выглядит асинхронно. Попробуйте переместить
console.info(output)внутрьfunction(err, csvLine){}сразу после циклаfor.