Как получить вывод после разбора 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.log(output)
fs.createReadStream('file.csv', {
encoding: 'utf8'
}).pipe(parser);
Выход на console.log(output)
всегда пустой массив. Пожалуйста, помогите мне решить это.
Я попытался понять пост здесь - Сохранить вывод 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);
Использование 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
}