2015-12-23 6 views
2

Попадание в пределы моего понимания здесь. У меня есть большой текстовый файл, который мне нужно разделить на куски 200 строк каждый (используйте mime.types для практики). Я использую readline, но он, кажется, игнорирует мои операторы pause/resume. Что мне не хватает:Разбиение текстового файла на основе количества строк в узле.js

// 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'); 
}); 

Я также попытался поставить изменение потока в функции обратного вызова операции записи:

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

Результат одинаков в обоих случаях:
node split file mime.types.1 1588 Done

В идеале я хочу решение, которое не полагается на дополнительные npm

+0

Какие Readline вы используете? ядро или https://www.npmjs.com/package/readline? – Ludo

+0

Ядро только. Удивительно, если это разрешимо с помощью ядра – stwissel

+0

Сколько раз отправляется событие линии? Можете ли вы установить точку останова? – Ludo

ответ

3

Я избавился от паузы/резюме. Кажется, они не поддерживаются потоком 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'); 
 
});

+0

Разница в коде выглядит как outStream.end() vout outStream.close() - сложный – stwissel

+0

https: // nodejs .org/api/stream.html # stream_writable_end_chunk_encoding_callback – Ludo

+0

close - это конкретный метод readline https://nodejs.org/api/readline.html#readline_rl_close – Ludo

Смежные вопросы