2016-12-06 54 views
3

我基本上想:管流編輯node.js的csv文件

  • 打開一個CSV文件作爲流
  • 做一些操作上的每一行
  • 流結果到第二csv文件

in 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); 

我得到 「類型錯誤:無效的非字符串/緩衝塊」。我究竟做錯了什麼 ?我對node.js完全陌生,所以請詳細說明您的答案。

回答

1

您正在正確讀取數據。但是,使用return不是正確轉換數據的方式。 CSV流不能同時輸出未轉換的數據(您在data事件處理程序中讀取的數據)和轉換後的數據,您將轉至writeStream

要使用pipe與writeStream,您將需要一個readableStream輸出轉換後的數據。這意味着圍繞您的轉換函數創建讀/寫流,並且管道fileReader > csvReader > transformStream > writeStream。 與您一樣,將函數附加到csv閱讀器的data事件上會更簡單,但您需要手動寫入文件。

正確的代碼代碼可能會更清楚這樣:

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)