相关文章推荐
失落的汽水  ·  Building a Real-Time ...·  1 月前    · 
讲道义的脸盆  ·  解析或序列化 XML - ...·  1 月前    · 
跑龙套的单杠  ·  分享6个对象数组去重的方法开发者社区·  4 周前    · 
纯真的炒饭  ·  MongoDB数据库中更新与删除数据 - ...·  3 周前    · 
体贴的红金鱼  ·  在 Office 加载项中使用 ...·  3 周前    · 
活泼的鼠标  ·  一拳超人H本子清碳 - 百度·  1 年前    · 
年轻有为的开水瓶  ·  学校加快建设一流本科教育的基本思路与举措-北 ...·  1 年前    · 
飘逸的水龙头  ·  那些搞笑的谐音梗文案 1 吸血鬼喜... ...·  1 年前    · 
冷静的口罩  ·  断魂小丑2六分钟片段 - 抖音·  2 年前    · 
飞奔的大脸猫  ·  判决书写错致单位损失百余万,法院副院长被判玩 ...·  2 年前    · 
Code  ›  在Node.js中如何逐行读取文件开发者社区
const
https://cloud.tencent.com/developer/article/1734998
飞翔的领带
2 年前
作者头像
ccf19881030
0 篇文章

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

前往专栏
腾讯云
开发者社区
文档 意见反馈 控制台
首页
学习
活动
专区
工具
TVP
文章/答案/技术大牛
发布
首页
学习
活动
专区
工具
TVP
返回腾讯云官网
社区首页 > 专栏 > ccf19881030的博客 > 在Node.js中如何逐行读取文件

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

作者头像
ccf19881030
发布 于 2020-10-29 11:45:31
5.5K 0
发布 于 2020-10-29 11:45:31
举报

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

本文翻译自 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');
 
推荐文章
失落的汽水  ·  Building a Real-Time Chat Micro-Frontend with Vue 3, Vite, and Module Federation
1 月前
讲道义的脸盆  ·  解析或序列化 XML - XML:可扩展标记语言 | MDN
1 月前
跑龙套的单杠  ·  分享6个对象数组去重的方法开发者社区
4 周前
纯真的炒饭  ·  MongoDB数据库中更新与删除数据 - 龙恩0707
3 周前
体贴的红金鱼  ·  在 Office 加载项中使用 Office 对话框 API - Office Add-ins | Microsoft Learn
3 周前
活泼的鼠标  ·  一拳超人H本子清碳 - 百度
1 年前
年轻有为的开水瓶  ·  学校加快建设一流本科教育的基本思路与举措-北京邮电大学超算中心
1 年前
飘逸的水龙头  ·  那些搞笑的谐音梗文案 1 吸血鬼喜... 来自一罐恬梦 - 微博
1 年前
冷静的口罩  ·  断魂小丑2六分钟片段 - 抖音
2 年前
飞奔的大脸猫  ·  判决书写错致单位损失百余万,法院副院长被判玩忽职守罪_一号专案_澎湃新闻-The Paper
2 年前
今天看啥   ·   Py中国   ·   codingpro   ·   小百科   ·   link之家   ·   卧龙AI搜索
删除内容请联系邮箱 2879853325@qq.com
Code - 代码工具平台
© 2024 ~ 沪ICP备11025650号