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

htrmnn0y  于 2022-12-06  发布在  Node.js
关注(0)|答案(2)|浏览(167)

我基本上是想:

  • 打开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完全是新手,所以请详细说明您的答案。

ih99xse1

ih99xse11#

您正在正确阅读数据。但是,使用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)
fhity93d

fhity93d2#

我基本上做到了这些:
解析(读取csv字符串并写入对象和数组)
字符串化(读取对象和数组并写入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;

相关问题