我想拆分文件:单独文件中的每行。初始文件真的很大。我用代码结束了:
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')
事件,执行"创建文件,打开它,写入数据,关闭数据",但是:
- 不可重复使用
- 不会遵循吻原则
- 将需要一个特殊而特定的逻辑来进行文件命名(它将字符串模式作为其构造函数中的参数,并带有该数字的占位符。等等。等等。)
我真的不建议那条路径,或者您要花费很长时间来实施非耐用的模块。不过,这将成为一个很好的可写的实施练习。