美文网首页Nodejs、TypeScript和Vuejs
在Node.js中如何逐行读取文件

在Node.js中如何逐行读取文件

作者: 雪域迷影 | 来源:发表于2020-10-27 00:22 被阅读0次

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

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

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

    FS模块

    在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

    您可能还喜欢...

    相关文章

      网友评论

        本文标题:在Node.js中如何逐行读取文件

        本文链接:https://www.haomeiwen.com/subject/nlymmktx.html