2016-12-06 3 views
3

Я в основном пытаются:трубы потоки редактировать файл CSV в node.js

  • открыть файл CSV, как поток
  • сделать некоторые операции на каждой линии
  • поток результат в секунду csv file

в node.js.

Вот мой код:

var fs = require("fs"); 
var csv = require("csv"); 

var readStream = fs.createReadStream("input.csv"); 
var writeStream = fs.createWriteStream("output.csv"); 

var csvStream = csv 
    .parse() 
    .on("data", function(data){ 
    //do some stuff with data 
    return(JSON.stringify(data)); 
    }) 
    .on("end", function(){ 
     console.log("done"); 
    }) 
    .on("error", function(error){ 
     console.log(error) 
    }); 

(readStream.pipe(csvStream)).pipe(writeStream); 

Я получаю "Ошибка типа: Invalid нестроковой/буфер фрагмент". Что я делаю не так ? Я совершенно новичок в node.js, поэтому, пожалуйста, подробно объясните свой ответ.

ответ

1

Вы правильно читаете данные. Однако использование return - это неправильный способ преобразования данных. CSV Stream не может в то же время выводить непереведенные данные (которые вы читаете в обработчике событий data) и преобразовывали данные, которые вы могли бы подключить к writeStream.

Чтобы использовать pipe с помощью writeStream, вам понадобился бы readableStream, выводящий ваши преобразованные данные. Это означало бы создание потока чтения/записи вокруг вашей функции преобразования и трубопровода fileReader > csvReader > transformStream > writeStream. Проще всего присоединить функцию к событию csv, как вы это делали, но вам нужно вручную записать в файл.

Правильный код код может быть более ясным этот путь:

var fs = require("fs"); 
var csv = require("csv"); 

var readStream = fs.createReadStream("input.csv"); // readStream is a read-only stream wit raw text content of the CSV file 
var writeStream = fs.createWriteStream("output.csv"); // writeStream is a write-only stream to write on the disk 

var csvStream = csv.parse(); // csv Stream is a read and write stream : it reads raw text in CSV and output untransformed records 

csvStream.on("data", function(data) { 
    //console.log(data) 

    writeStream.write(JSON.stringify(data)); 
}) 
.on("end", function(){ 
    console.log("done"); 
}) 
.on("error", function(error){ 
    console.log(error) 
}); 

readStream.pipe(csvStream)