Read a file one line at time using Node
September 13, 2015
I found some better code on the StrongLoop site for reading a file one line at a time in Node.
It's something that should be in any scripting environment's standard library, but isn't in Node's, so before I lose the link, the StrongLoop article's [link no longer available] and and that code as a gist is here. code is below.
Drop that module into your Node project, usage is then:
var readFileByLine = require('./readFileByLine');
function yourFunctionUsingOneLine(line) {
;
}
readFileByLine('yourFile', yourFunctionUsingOneLine);
Update November 2023: The code, as I leave Github:
/*jslint node: true, nomen: true*/
'use strict';
// code from https://strongloop.com/strongblog/practical-examples-of-the-new-node-js-streams-api/
var fs = require('fs'),
stream = require('stream'),
liner = new stream.Transform({ objectMode: true }),
readFileByLine;
// For Node 0.8
if (!stream.Transform) {
stream = require('readable-stream');
}
liner._transform = function (chunk, encoding, done) {
var data = chunk.toString(),
lines = '';
if (this._lastLineData) {
data = this._lastLineData + data;
}
lines = data.split('\n'); // skips blank lines
this._lastLineData = lines.splice(lines.length - 1, 1)[0];
lines.forEach(this.push.bind(this));
done();
};
liner._flush = function (done) {
if (this._lastLineData) {
this.push(this._lastLineData);
}
this._lastLineData = null;
done();
};
readFileByLine = function (fileName, doFunction) {
var source = fs.createReadStream(fileName);
source.pipe(liner);
liner.on('readable', function () {
var line = liner.read();
while (line) {
doFunction(line); // do something with the line
line = liner.read();
}
});
};
module.exports = readFileByLine;