【问题标题】:pipe streams to edit csv file in node.js管道流以在 node.js 中编辑 csv 文件
【发布时间】:2017-04-21 00:24:52
【问题描述】:

我基本上是在尝试:

  • 以流形式打开 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


    【解决方案1】:

    您正在正确读取数据。但是,使用 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 字符串并写入对象和数组)
    字符串化(读取对象和数组并写入 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;
    

    【讨论】:

    • 嗨,欢迎来到 Stack Overflow。虽然此代码可能会回答问题,但提供有关此代码为何和/或如何回答问题的额外上下文可提高其长期价值。
    • edit回答并在此处添加信息。
    猜你喜欢
    • 2014-09-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-02-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多