หากคุณสามารถใส่ข้อมูลสุดท้ายลงในอาเรย์แล้วคุณจะไม่สามารถใส่มันลงในสตริงและแยกมันได้ตามที่ได้รับการแนะนำ? ไม่ว่าในกรณีใดหากคุณต้องการประมวลผลไฟล์ทีละบรรทัดคุณสามารถลองทำสิ่งต่อไปนี้:
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 ) ฉันคิดว่า (อย่างน้อยในรุ่นที่ใหม่กว่า) substring ไม่ได้คัดลอกข้อมูล แต่สร้างวัตถุ SlicedString พิเศษ (จากอย่างรวดเร็วที่รหัสที่มา v8) ไม่ว่าในกรณีใด ๆ นี่คือการดัดแปลงที่หลีกเลี่ยงซับสตริงที่กล่าวถึง (ทดสอบบนไฟล์หลายเมกะไบต์ที่มีมูลค่าของ "การทำงานทั้งหมดและไม่มีการเล่นทำให้ Jack เป็นเด็กที่น่าเบื่อ"):
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);
}
});
}