Если вы можете поместить окончательные данные в массив, то разве вы не сможете поместить их в строку и разделить, как было предложено? В любом случае, если вы хотите обработать файл по одной строке за раз, вы также можете попробовать что-то вроде этого:
var fs = require('fs');
function readLines(input, func) {
var remaining = '';
input.on('data', function(data) {
remaining += data;
var index = remaining.indexOf('\n');
while (index > -1) {
var line = remaining.substring(0, index);
remaining = remaining.substring(index + 1);
func(line);
index = remaining.indexOf('\n');
}
});
input.on('end', function() {
if (remaining.length > 0) {
func(remaining);
}
});
}
function func(data) {
console.log('Line: ' + data);
}
var input = fs.createReadStream('lines.txt');
readLines(input, func);
РЕДАКТИРОВАТЬ: (в ответ на комментарий phopkins ) Я думаю (по крайней мере, в более новых версиях) подстрока не копирует данные, но создает специальный объект SlicedString (с первого взгляда на исходный код v8). В любом случае, здесь есть модификация, которая избегает упомянутой подстроки (проверено на файле стоимостью в несколько мегабайт «Вся работа и отсутствие игры делает Джека скучным мальчиком»):
function readLines(input, func) {
var remaining = '';
input.on('data', function(data) {
remaining += data;
var index = remaining.indexOf('\n');
var last = 0;
while (index > -1) {
var line = remaining.substring(last, index);
last = index + 1;
func(line);
index = remaining.indexOf('\n', last);
}
remaining = remaining.substring(last);
});
input.on('end', function() {
if (remaining.length > 0) {
func(remaining);
}
});
}