我想拆分文件:每行都在一个单独的文件中。初始文件非常大。我完成了以下代码:
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();
}
});
它有效,但很难看。是否有更多的方法可以做到这一点?也许有管道,没有暂停/恢复。
注意:这不是关于行/文件/等的问题。问题是关于流,我只是试着用问题说明它
答案 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')
事件,“创建文件,打开它,写入数据,关闭它”但它:
我真的不建议使用这条路径,否则您将花费很长时间来实现非实际可重用的模块。但是,这将是一个很好的可写实施练习。