转换node.js流的简洁方法?

时间:2013-10-12 00:56:11

标签: javascript node.js

我正在尝试将换行符分隔的JSON文件转换为CSV(一种愚蠢的任务,但这没关系),我很好奇如何在 node.js中轻松完成此操作。到目前为止我所拥有的是,

var csv = require('csv'), 
    fs = require('fs'),
    JSONStream = require('JSONStream');

var stream = fs.createReadStream('input.json', {encoding: 'utf8'})
    .pipe(JSONStream.parse());
csv().from(stream).to('out.csv');

这有效,但不允许我在按键上表达排序。例如,如果我有这样的输入文件,

{"foo": 1, "bar": 2}
{"bar": 3, "foo": -1}

我想添加一个转换函数,

function(line_object) { return [line_object.foo, line_object.bar]; };

这样我的输出就是行1, 2-1, 3,对应于foo是第1列而bar是第2列,而不是当前行为{{1 }和1, 2

然而,在线的所有示例似乎都非常冗长,无法添加变换器。他们似乎创建了3, -1个对象,然后在这些对象上设置require('stream').Transform函数。 问题:有更干净/更简洁的方法吗?非常感谢,请原谅我的无知,因为这几乎是我编写的第一个_transform代码。

1 个答案:

答案 0 :(得分:3)

event-stream可能有用:

var fs         = require('fs');
var csv        = require('csv');
var JSONStream = require('JSONStream');
var es         = require('event-stream');

es.pipeline(
  fs.createReadStream('input.json'),
  JSONStream.parse(),
  es.map(function(data, next) {
    next(null, [ data.foo, data.bar ]);
  }),
  csv().to('out.csv')
);