nodejs:单独文件中的每一行



我想拆分文件:单独文件中的每行。初始文件真的很大。我用代码结束了:

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

它有效,但很丑陋。还有更多野性的方法吗?也许没有管道,没有暂停/简历。

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

您可以使用Node的内置readline模块。

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

请注意,如果最后没有newline,这将丢失文件的最后一行,因此请确保您的最后一行数据之后是newline。

还请注意,文档表明它是稳定索引2,含义:

稳定性:2-不稳定的API正在沉降过程中,但具有 尚未进行足够的现实测试以被认为是稳定的。 如果合理的话,将保持向后兼容。

以下情况如何?你试过了吗?暂停和简历逻辑在这里确实不需要。

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

动态管道很难...


编辑:您可以创建一个可写的(SO pipe() ABLE)对象,on('data')事件,执行"创建文件,打开它,写入数据,关闭数据",但是:

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

我真的不建议那条路径,或者您要花费很长时间来实施非耐用的模块。不过,这将成为一个很好的可写的实施练习。

相关内容

  • 没有找到相关文章

最新更新