管道流来编辑node.js中的csv文件

问题描述 投票:3回答:2

我基本上是想:

  • 以流形式打开csv文件
  • 在每一行上做一些操作
  • 将结果传输到第二个csv文件

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

我得到“TypeError:无效的非字符串/缓冲区块”。我究竟做错了什么 ?我是node.js的新手,所以请详细说明你的答案。

node.js csv stream
2个回答
2
投票

您正在正确读取数据。但是,使用return不是转换数据的正确方法。 CSV Stream不能同时输出未转换的数据(您在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)

2
投票

我基本上完成了这些:

解析(读取csv字符串并写入对象和数组) stringified(读取对象和数组并写入csv字符串) 管道所有写入流到我的文件

function readingAppendingAndWritingToCSVFile(readStream, writeStream) {
  const results = [];
  const p = new Promise((resolve, reject) => {
    readStream.pipe(csv.parse({ columns: true }))
    .on('data', (data) => {
      console.log('data --------------', data);
      data.name = 'somename'; // will add new column with same data in all rows
      console.log('data after pushing ----------', data);
      results.push(data);
    })
    .on('error', (err) => {
      console.log('error ------------', err);
      reject();
    })
    .on('finish', () => {
      console.log();
      console.log('all the csv strings parsed to objects -------------', results);
    })
    .pipe(csv.stringify({ header: true }))
    .pipe(writeStream);
  });
  return p;
© www.soinside.com 2019 - 2024. All rights reserved.