Nodejs - 从文件中逐行读取,为每一行执行异步操作并重新执行

Or *_*ger 13 node.js

我正在尝试逐行读取文件,执行一些具有回调的操作以及函数完成后恢复行读取.例如:

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);
});
Run Code Online (Sandbox Code Playgroud)

我的印象是上面的例子基本上应该读一行,等待2秒,console.log然后继续下一行.真正发生的是它等待前2秒,然后喷出很多console.log

Jav*_*ero 15

一行行模块可以帮助你阅读大的文本文件,一行行,没有文件缓存到内存中.

您可以异步处理这些行.这是提供的示例:

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.
});
Run Code Online (Sandbox Code Playgroud)


Jav*_*zán 15

无需安装任何外部库的解决方案。您只需要本机node.js“readline”模块。只需执行以下操作:

import fs from "fs";
import readline from "readline";

const readInterface = readline.createInterface({
  input: fs.createReadStream(path.join(__dirname, 'myfile.txt'))
});

for await (const line of readInterface){
  await someAsynchronousOperation();
}

Run Code Online (Sandbox Code Playgroud)

来源(官方文档):https ://nodejs.org/api/readline.html#rlsymbolasynciterator


Zee*_*mon 5

存在一个非常好的线路阅读器模块, 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
      }
   });
Run Code Online (Sandbox Code Playgroud)

还有“java 风格”的界面,用于更多控制:

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

另一个很酷的解决方案:

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)

});
Run Code Online (Sandbox Code Playgroud)

  • 我认为它是在考虑 OP 的要求的情况下添加的,我认为他正在尝试读取一行然后等待然后读取一行等等.. (2认同)