【问题标题】:nodejs: each line in separate filenodejs:单独文件中的每一行
【发布时间】:2015-05-13 23:45:26
【问题描述】:

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

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();
    }
});

它有效,但它很丑。有没有更多的nodish方式来做到这一点?也许有管道并且没有暂停/恢复。

注意:这不是关于 lines/files/etc 的问题。这个问题是关于流的,我只是试图用这个问题来说明它

【问题讨论】:

    标签: node.js stream


    【解决方案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++
    });
    

    请注意,如果末尾没有换行符,这将丢失文件的最后一行,因此请确保最后一行数据后跟一个换行符。

    另请注意,文档表明它是 Stability index 2,意思是:

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

    【讨论】:

      【解决方案2】:

      下面的呢?你试过了吗?这里不需要暂停和恢复逻辑。

      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()able)对象,on('data') 事件会执行“创建文件,打开它,写入数据,关闭它”但是它:

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

      我真的不推荐该路径,否则您将需要很长时间才能实现不可重用的模块。不过,这将是一个很好的可写实现练习。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2021-10-19
        • 2012-11-09
        • 2013-01-31
        • 1970-01-01
        • 2021-06-13
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多