nodejs:单独文件中的每一行

时间:2015-05-13 14:55:30

标签: node.js stream

我想拆分文件:每行都在一个单独的文件中。初始文件非常大。我完成了以下代码:

var fileCounter = -1;

function getWritable() {
      fileCounter++;
      writable = fs.createWriteStream('data/part'+ fileCounter + '.txt', {flags:'w'});
      return writable;
}

var readable = fs.createReadStream(file).pipe(split());
readable.on('data', function (line) {
    var flag = getWritable().write(line, function() {
      readable.resume();
    });
    if (!flag) {
      readable.pause();
    }
});

它有效,但很难看。是否有更多的方法可以做到这一点?也许有管道,没有暂停/恢复。

注意:这不是关于行/文件/等的问题。问题是关于流,我只是试着用问题说明它

2 个答案:

答案 0 :(得分:1)

您可以使用Node's built-in readline module

var fs = require('fs');
var readline = require('readline');
var fileCounter = -1;

var file = "foo.txt";
readline.createInterface({
    input: fs.createReadStream(file),
    terminal: false
}).on('line', function(line) {
   var writable = fs.createWriteStream('data/part'+ fileCounter + '.txt', {flags:'w'});
   writable.write(line);
   fileCounter++
});

请注意,如果最后没有换行符,则会丢失文件的最后一行,因此请确保最后一行数据后跟换行符。

另请注意,文档表明它是稳定性指数2,意思是:

  

稳定性:2 - 不稳定API正在解决,但有   还没有足够的实际测试被认为是稳定的。   如果合理,将保持向后兼容性。

答案 1 :(得分:0)

以下怎么样?你试过了吗?这里不需要暂停和恢复逻辑。

var split = require('split');
var fs = require('fs');
var fileCounter = -1;

var readable = fs.createReadStream(file).pipe(split());
readable.on('data', function (line) {
    fileCounter++;
    var writable = fs.createWriteStream('data/part'+ fileCounter + '.txt', {flags:'w'});
    writable.write(line);
    writable.close();
});

动态管道会很难......

编辑:你可以创建一个writable(所以pipe()能)对象,on('data')事件,“创建文件,打开它,写入数据,关闭它”但它:

  • 不可重复使用
  • 不遵循KISS原则
  • 需要一个特殊的特定逻辑来进行文件命名(它会在其构造函数中接受一个字符串模式作为参数,并带有一个数字的占位符。等等......)

我真的不建议使用这条路径,否则您将花费​​很长时间来实现非实际可重用的模块。但是,这将是一个很好的可写实施练习。