Nodejs – 从文件逐行读取,为每行执行asynchronous操作并重用

我试图逐行读取一个文件,执行一些有callback的动作,并在函数完成时恢复行读取。 例如:

var fs = require('fs'); var readline = require('readline'); var stream = require('stream'); var instream = fs.createReadStream('./phrases.txt'); var outstream = new stream; var rl = readline.createInterface(instream, outstream); rl.on('line', function (line) { rl.pause(); setTimeout(function () { console.log('resuming'); rl.resume(); }, 2000); }); 

我在上面的例子的印象之下基本上应该读一行,等待2秒, console.log ,然后继续下一行。 真正发生的是等待头2秒,然后喷出大量的console.log

逐行模块可帮助您逐行读取大型文本文件,而无需将文件caching到内存中。

您可以asynchronous处理这些行。 这是提供的例子:

 var LineByLineReader = require('line-by-line'), lr = new LineByLineReader('big_file.txt'); lr.on('error', function (err) { // 'err' contains error object }); lr.on('line', function (line) { // pause emitting of lines... lr.pause(); // ...do your asynchronous line processing.. setTimeout(function () { // ...and continue emitting lines. lr.resume(); }, 100); }); lr.on('end', function () { // All lines are read, file is closed now. }); 

可能是这个代码帮助你,如果答案好,请投票。

 function createLineReader(fileName){ var EM = require("events").EventEmitter var ev = new EM() var stream = require("fs").createReadStream(fileName) var remainder = null; stream.on("data",function(data){ if(remainder != null){//append newly received data chunk var tmp = new Buffer(remainder.length+data.length) remainder.copy(tmp) data.copy(tmp,remainder.length) data = tmp; } var start = 0; for(var i=0; i<data.length; i++){ if(data[i] == 10){ //\n new line var line = data.slice(start,i) ev.emit("line", line) start = i+1; } } if(start<data.length){ remainder = data.slice(start); }else{ remainder = null; } }) stream.on("end",function(){ if(null!=remainder) ev.emit("line",remainder) }) return ev } //---------main--------------- fileName = process.argv[2] lineReader = createLineReader(fileName) lineReader.on("line",function(line){ console.log(line.toString()) //console.log("++++++++++++++++++++") }) 

存在一个非常漂亮的线阅读器模块, https://github.com/nickewing/line-reader

简单的代码:

  var lineReader = require('line-reader'); lineReader.eachLine('file.txt', function(line, last) { // do whatever you want with line... console.log(line); if(last){ // or check if it's the last one } }); 

还有“java风格”的界面进行更多的控制:

 lineReader.open('file.txt', function(reader) { if (reader.hasNextLine()) { reader.nextLine(function(line) { console.log(line); }); } }); 

另一个很酷的解决

 var fs = require('fs'), sleep = require('sleep'), readline = require('readline'); var rd = readline.createInterface({ input: fs.createReadStream('phrases.txt'), output: process.stdout, terminal: false }); rd.on('line', function(line) { console.log('-------') console.log(line); sleep.sleep(2) }); 
 const readline = require('readline'); const fs = require('fs'); const rl = readline.createInterface({ input: fs.createReadStream('sample.txt') }); rl.on('line', (line) => { console.log(`Line from file: ${line}`); }); 

来源: https : //nodejs.org/api/readline.html#readline_example_read_file_stream_line_by_line