本文翻译自 How to read a file line by line in Node.js

能够逐行读取文件为我们提供了一个读取大型文件的机会,而无需将它们完全加载到内存中。 它还允许我们仅查找相关信息,并在找到该信息后停止搜索。

我们已经讨论了 如何在Java中逐行读取文件 ,让我们看一下Node.js逐行读取文件的方式。

在Node.js中逐行读取文件的最简单方法是使用本地 fs模块 fs.readFileSync() 方法:

const fs = require('fs');
try {
    // read contents of the file
    const data = fs.readFileSync('file.txt', 'UTF-8');
    // split the contents by new line
    const lines = data.split(/\r?\n/);
    // print all lines
    lines.forEach((line) => {
        console.log(line);
    });
} catch (err) {
    console.error(err);

此方法将文件的全部内容同步读取到内存中,然后通过换行符拆分其内容。 乍看起来,它看起来很完美,但是有两个问题:

  • 1.它是阻塞的,这意味着它将阻塞程序的执行,直到将整个文件加载到内存中为止。
  • 2.如果文件很大(千兆字节或更多),将对内存消耗产生严重影响。
    通过使用非阻塞版本fs.readFile()可以解决第一个问题,但是在生产环境中,您不需要执行将整个文件读入内存的操作。

但是,如果您只想读取小文件,则可以正常工作。

Readline模块

Readline是另一个Node.js本机模块,是专门为此目的开发的-从任何readable stream中一次读取一行。 您甚至可以使用此模块从命令行读取输入数据。

这是您可以在代码中访问它的方式(无需安装):

const readline = require('readline');

由于readline模块适用于可读流,因此我们必须首先使用fs模块创建流,如下所示:

const rl = readline.createInterface({
    input: fs.createReadStream('file.txt'),
    output: process.stdout,
    terminal: false
});

现在,我们可以侦听rl对象上的line事件,该事件将在从流中读取新行时触发:

rl.on('line', (line) => {
    console.log(line);
});

完整的代码如下所示:

const fs = require('fs');
const readline = require('readline');
const rl = readline.createInterface({
    input: fs.createReadStream('file.txt'),
    output: process.stdout,
    terminal: false
});
rl.on('line', (line) => {
    console.log(line);
});

Line-Reader模块

line-reader是一个开源模块,用于在Node.js中逐行读取文件。 您可以通过在终端中运行以下命令将其添加到项目中:

$ npm i line-reader --save

如果使用的是yarn,可以通过在终端中运行以下命令将其添加到项目中:

$ yarn add line-reader

line-reader模块提供了eachLine()方法,该方法读取给定文件的每一行。 它需要一个带有两个参数的回调函数:行内容和一个布尔值,指定读取的行是否为文件的最后一行。 这是一个例子:

const lineReader = require('line-reader');
lineReader.eachLine('file.txt', (line, last) => {
    console.log(line);
});

使用此模块的另一个好处是,当某些情况变为真时,停止读取。 可以通过从回调函数返回false来实现:

const lineReader = require('line-reader');
lineReader.eachLine('file.txt', (line) => {
    console.log(line);
    // stop if line contains `NEW`
    if(line.includes('NEW')) {
        // stop reading and close the file
        return false;
});

LineByLine模块

linebyline是另一个开放源代码库,可用于在Node.js中逐行读取文件。

让我们将其添加到您的项目中:

$ npm i linebyline --save

这个包简单地在内部流本机readline模块,读取和缓冲新行,为每行发出一个行事件:

const readline = require('linebyline');
// read all lines
rl = readline('file.txt');
// listen for `line` event
rl.on('line', (line, lineCount, byteCount) => {
    console.log(line);
}).on('error', (err) => {
    console.error(err);
});

进一步阅读

如果您喜欢阅读本文,则可能还喜欢以下文章:

喜欢这篇文章吗? 在TwitterLinkedIn上关注我。 您也可以订阅RSS Feed

上次更新时间:2020年2月21日

Node.js

您可能还喜欢…

本文介绍了运用readline逐行读取的两种实现,分享给大家,具体如下: 什么是Readline Readline是Node.js里实现标准输入输出的封装好的模块,通过这个模块我们可以以逐行的方式读取数据流。使用require(“readline”)可以引用模块。 效果图如下: 左边1.log 为源文件 右边1.readline.log为复制后的文件 下边为命令行输出 实现方式一: var readline = require('readline'); var fs = require('fs'); var os = require('os'); var fReadName = './1.
var fs = require("fs"); var lineReader = require('line-reader'); var async = require("async"); var readFile= require("./路径/readFileDao"); function run(){ var path = 'E:/';    //设置读取文件路径
readline模块提供了一个接口用来从一个可读的流读取数据(比如process.stdin),每次读取一行。 在nodejs的命令行模式下默认引入了readline模块,但是如果要执行node.js脚本文件的话还是需要显示引入readline模块。 注意:readline适合动态交互式流处理,不是我们平常意义上说的按行读取文件。当流被创建时,readline只会监听新增的行而忽略已有的行。
运用readline逐行读取的两种实现效果图如下:左边1.log 为源文件右边1.readline.log为复制后的文件下边为命令行输出实现方式一:var readline = require('readline'); var fs = require('fs'); var os = require('os'); var fReadName = './1.log'; var fWriteName
node.js使用readline按行读取文件内容1.实现代码var fs = require('fs'); var readline = require('readline'); * 按行读取文件内容 * 返回:字符串数组 * 参数:fReadName:文件名路径 * callback:回调函数 function readFileToArr(fReadName,cal...
var liner = new stream.Transform( { objectMode: true } ) liner._transform = function (chunk, encoding, done) {
最近遇到了这样的问题: 如何每次从一个文件里面依次读里面的几行 对nodejs提供的readline和一些三方npm例如lineReader不满意,就自己实现一个简易版本var fs = require('fs'); var data = fs.readFileSync('url.dat', 'utf8'); var lines = data.split("\n");function get_l
Node.js是一种运行在服务器端的JavaScript语言,因为其轻便、高效的特点,深受开发者的喜爱。在Node.js逐行读取文件是非常常见的操作。下面,我们将详细介绍如何使用Node.js逐行读取文件。 在Node.js,我们可以使用内置的fs模块来处理文件。使用fs模块,我们可以通过以下代码读取文件内容: const fs = require('fs'); fs.readFile('file.txt', 'utf-8', (err, data) => { if (err) throw err; console.log(data); 这段代码可以读取文件file.txt的内容,并将其打印到控制台上。 要逐行读取文件,我们可以先使用fs模块的readFileSync方法来同步读取文件的内容: const fs = require('fs'); const content = fs.readFileSync('file.txt', 'utf-8'); console.log(content); 然后,我们可以使用split方法将文件内容切成每一行,再遍历输出每一行: const fs = require('fs'); const content = fs.readFileSync('file.txt', 'utf-8'); const lines = content.split('\n'); lines.forEach(line => { console.log(line); 以上就是使用Node.js逐行读取文件的方法。通过以上的介绍,相信大家已经有了更深入的了解。在实际开发,可以根据具体的业务场景选择适合的方法,以达到高效率、高质量的开发效果。