在这里达到了我的理解极限。我有一个很大的文本文件,需要将其分成每块 200 行的块(使用 mime.types 进行练习)。我正在使用readline,但它似乎忽略了我的pause / resume陈述。我想念什么:
// Splits a given file into smaller subfiles by line number
var infileName = 'mime.types';
var fileCount = 1;
var count = 0;
var fs = require('fs');
var outfileName = infileName + '.' + fileCount;
var inStream = fs.createReadStream(infileName);
var outStream = fs.createWriteStream(outfileName);
var lineReader = require('readline').createInterface({
input: inStream
});
lineReader.on('line', function(line) {
count++;
lineReader.pause();
outStream.write(line + '\n');
if (count >= 200) {
fileCount++;
console.log('file ', outfileName, count);
outStream.close();
outfileName = infileName + '.' + fileCount;
outStream = fs.createWriteStream(outfileName);
count = 0;
}
lineReader.resume();
});
lineReader.on('close', function() {
if (count > 0) {
console.log('Final close:', outfileName, count);
}
inStream.close();
outStream.close();
console.log('Done');
});
Run Code Online (Sandbox Code Playgroud)
我还尝试将流的更改放入写入操作的回调中:
lineReader.on('line', function(line) {
count++;
lineReader.pause();
outStream.write(line + '\n', function() {
if (count >= 200) {
fileCount++;
console.log('file ', outfileName, count);
outStream.close();
outfileName = infileName + '.' + fileCount;
outStream = fs.createWriteStream(outfileName);
count = 0;
}
lineReader.resume();
});
});
Run Code Online (Sandbox Code Playgroud)
两种情况的结果是相同的:
node split
file mime.types.1 1588
Done
理想情况下,我想要一个不依赖额外 npm 的解决方案
我摆脱了暂停/恢复。它们似乎不受 readline 流支持。我所做的只是每 200 行提供一个新的可写流。
// Splits a given file into smaller subfiles by line number
var infileName = 'mime.types';
var fileCount = 1;
var count = 0;
var fs = require('fs');
var outStream;
var outfileName = infileName + '.' + fileCount;
newWriteStream();
var inStream = fs.createReadStream(infileName);
var lineReader = require('readline').createInterface({
input: inStream
});
function newWriteStream(){
outfileName = infileName + '.' + fileCount;
outStream = fs.createWriteStream(outfileName);
count = 0;
}
lineReader.on('line', function(line) {
count++;
outStream.write(line + '\n');
if (count >= 200) {
fileCount++;
console.log('file ', outfileName, count);
outStream.end();
newWriteStream();
}
});
lineReader.on('close', function() {
if (count > 0) {
console.log('Final close:', outfileName, count);
}
inStream.close();
outStream.end();
console.log('Done');
});Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
3825 次 |
| 最近记录: |