Node.js在CSV模块中管道gzip流

时间:2014-07-22 21:32:30

标签: node.js csv stream

我有一个gzip压缩的CSV文件,我想阅读,执行一些转换,然后回写gzipped。我正在使用node-csv模块进行CSV转换。

代码的简化版本如下所示:

// dependencies
var fs = require('fs'),
    zlib = require('zlib'),
    csv = require('csv');  // http://www.adaltas.com/projects/node-csv/

// filenames
var sourceFileName = process.argv[2] || 'foo.csv.gz';
    targetFileName = process.argv[3] || 'bar.csv.gz';

// streams
var reader = fs.createReadStream(sourceFileName),
    writer = fs.createWriteStream(__dirname + '\\' + targetFileName),
    gunzip = zlib.createGunzip(),
    gzip = zlib.createGzip();

csv()
    .from.stream( reader.pipe(gunzip) )
    .to.stream( gzip.pipe(writer) )  // <-- the output stream
    .transform( function(row) {
      // some operation here
      return row;
    });

问题是这些代码有效地写入了具有指定名称的文件,尽管没有gzip压缩,即如果文件被删除了.gz,它可以作为常规CSV打开。

接下来的问题是,如何将csv()。to.stream()传递给gzip数据并将其传递给编写器的输出流?

谢谢!

1 个答案:

答案 0 :(得分:2)

您正在将csv传递给作者,因为.pipe会返回它的链接参数。

您需要更改:

    .to.stream( gzip.pipe(writer) )  // <-- the output stream 

要:

    .to.stream( gzip )  // <-- the output stream  
 . . . 
gzip.pipe(writer);