大きなファイルを1行ずつ読み込もうとしています。Quoraの質問それはその主題を扱っていますが、全体をまとめるためのいくつかのつながりが欠けています。
var Lazy=require("lazy");
new Lazy(process.stdin)
.lines
.forEach(
function(line) {
console.log(line.toString());
}
);
process.stdin.resume();
私が理解したいのは、このサンプルのように STDIN ではなくファイルから一度に 1 行ずつ読み取る方法です。
私は試した:
fs.open('./VeryBigFile.csv', 'r', '0666', Process);
function Process(err, fd) {
if (err) throw err;
// DO lazy read
}
しかし、うまくいきません。いざというときには PHP のようなものを使用できることはわかっていますが、これを解決したいと思います。
ファイルが、それを実行しているサーバーのメモリ容量よりもはるかに大きいため、他の回答は機能しないと思います。
ベストアンサー1
Node.js v0.12以降およびNode.js v4.0.0以降では、安定した読み込まれた行コアモジュール。外部モジュールを使用せずにファイルから行を読み取る最も簡単な方法は次のとおりです。
const fs = require('fs');
const readline = require('readline');
async function processLineByLine() {
const fileStream = fs.createReadStream('input.txt');
const rl = readline.createInterface({
input: fileStream,
crlfDelay: Infinity
});
// Note: we use the crlfDelay option to recognize all instances of CR LF
// ('\r\n') in input.txt as a single line break.
for await (const line of rl) {
// Each line in input.txt will be successively available here as `line`.
console.log(`Line from file: ${line}`);
}
}
processLineByLine();
あるいは、次のようにもできます。
var lineReader = require('readline').createInterface({
input: require('fs').createReadStream('file.in')
});
lineReader.on('line', function (line) {
console.log('Line from file:', line);
});
lineReader.on('close', function () {
console.log('all done, son');
});
final がなくても、最後の行は正しく読み取られます (Node v0.12 以降) \n
。
更新:この例はNodeのAPI公式ドキュメントに追加されました。