I tried to find an example on using
node.js to read a file line by line. I found none so I had to write one myself.
// Module: FileLineReader
// Constructor: FileLineReader(filename, bufferSize = 8192)
// Methods: hasNextLine() -> boolean
// nextLine() -> String
//
//
var fs = require("fs");
var sys = require("sys");
exports.FileLineReader = function(filename, bufferSize) {
if(!bufferSize) {
bufferSize = 8192;
}
//private:
var currentPositionInFile = 0;
var buffer = "";
var fd = fs.openSync(filename, "r");
// return -1
// when EOF reached
// fills buffer with next 8192 or less bytes
var fillBuffer = function(position) {
var res = fs.readSync(fd, bufferSize, position, "ascii");
buffer += res[0];
if (res[1] == 0) {
return -1;
}
return position + res[1];
};
currentPositionInFile = fillBuffer(0);
//public:
this.hasNextLine = function() {
while (buffer.indexOf("\n") == -1) {
currentPositionInFile = fillBuffer(currentPositionInFile);
if (currentPositionInFile == -1) {
return false;
}
}
if (buffer.indexOf("\n") > -1) {
return true;
}
return false;
};
//public:
this.nextLine = function() {
var lineEnd = buffer.indexOf("\n");
var result = buffer.substring(0, lineEnd);
buffer = buffer.substring(result.length + 1, buffer.length);
return result;
};
return this;
};
And some TestCode:
var assert = require("assert"),
sys = require("sys"),
flr = require("./FileLineReader");
try {
var reader = new flr.FileLineReader("top-5.txt", 10);
sys.debug(__filename + " First line...");
assert.equal(reader.hasNextLine(), true);
assert.equal(reader.nextLine(), "yahoo.com");
sys.debug(__filename + " Next line...");
assert.equal(reader.hasNextLine(), true);
assert.equal(reader.nextLine(), "youtube.com");
sys.debug(__filename + " Next line...");
assert.equal(reader.hasNextLine(), true);
assert.equal(reader.nextLine(), "facebook.com");
sys.debug(__filename + " Next line...");
assert.equal(reader.hasNextLine(), true);
assert.equal(reader.nextLine(), "live.com");
assert.equal(reader.hasNextLine(), true);
assert.equal(reader.nextLine(), "msn.com");
assert.equal(reader.hasNextLine(), false);
} catch (err) {
sys.debug(__filename + ": ERROR: " + err);
}
The testdata file top-5.txt looked like this:
yahoo.com
youtube.com
facebook.com
live.com
msn.com