I have a large file (utf8). I know fs.createReadStream
can create stream to read a large file, but not synchronized. So i try to use fs.readSync
, b
I built a simpler version JB Kohn's answer that uses split() on the buffer. It works on the larger files I tried.
/*
* Synchronously call fn(text, lineNum) on each line read from file descriptor fd.
*/
function forEachLine (fd, fn) {
var bufSize = 64 * 1024;
var buf = new Buffer(bufSize);
var leftOver = '';
var lineNum = 0;
var lines, n;
while ((n = fs.readSync(fd, buf, 0, bufSize, null)) !== 0) {
lines = buf.toString('utf8', 0 , n).split('\n');
lines[0] = leftOver+lines[0]; // add leftover string from previous read
while (lines.length > 1) { // process all but the last line
fn(lines.shift(), lineNum);
lineNum++;
}
leftOver = lines.shift(); // save last line fragment (may be '')
}
if (leftOver) { // process any remaining line
fn(leftOver, lineNum);
}
}