Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >在Node.js中逐行读取文件【纯技术】

在Node.js中逐行读取文件【纯技术】

原创
作者头像
Jean
修改于 2019-09-24 09:25:34
修改于 2019-09-24 09:25:34
8.5K00
代码可运行
举报
文章被收录于专栏:Web行业观察Web行业观察
运行总次数:0
代码可运行

介绍

在计算机科学中,文件是一种资源,用于在计算机的存储设备中离散地记录数据。Node.js不会以任何方式覆盖它,并且可以与文件系统中被视为文件的任何文件一起使用。

读取文件和资源有许多用途:

  • 统计,分析和报告
  • 机器学习
  • 处理大型文本文件或日志

有时,这些文件可能非常大,存储了千兆字节或TB级的文件,而整个文件的读取效率很低。

能够逐行读取文件使我们能够仅查找相关信息,并在找到所需内容后停止搜索。它还使我们可以将数据分解为逻辑片段,就像文件是CSV格式一样。

Readline(从v0.12开始)

Node.js具有本机模块来读取文件,从而使我们可以逐行读取文件。它是在2015年添加的,旨在Readable一次从任何流中读取一行。

这个事实使它成为通用的选项,不仅适用于文件,甚至适用于诸如的命令行输入process.stdin。有关readline模块的文档可在此处找到。

readline本机模块一样。您不必使用npm任何其他软件包管理器来添加它,只需require

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
const readline = require('readline');

你很高兴去!

由于该readline方法应随流一起提供,因此我们必须首先使用另一个本机模块-来创建它fs

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
const fs = require('fs');

下一步是使用以下createInterface()函数创建将从流中读取的对象:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
const readInterface = readline.createInterface({
    input: fs.createReadStream('/path/to/file'),
    output: process.stdout,
    console: false
});

确保/path/to/file用文件系统中文件的实际路径替换。

准备工作完成后,可以通过以下方式逐行读取文件并将其内容打印到控制台:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
readInterface.on('line', function(line) {
    console.log(line);
});

在这里,我们实质上是说,只要line事件发生在中,readInterface就应该调用我们的函数并将从流中读取的内容传递给它。在我们的情况下,我们不想使事情复杂化,而只是将其打印到控制台上。

在线阅读器

在详细说明了如何使用本机Node.js模块逐行读取文件之后,让我们使用npm 的开源行读取器模块来查看它的较短版本。

由于它是一个非本地模块,因此我们需要确保已使用正确的方式初始化了npm项目npm init,然后进行安装:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
$ npm install --save line-reader

这将安装依赖项并将其添加到package.json文件中。

完成后,逐行读取文件仅与前面的示例相似,而无需readInterface在中间创建文件:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
const lineReader = require('line-reader');

lineReader.eachLine('/path/to/file', function(line) {
    console.log(line);
});

这里一个非常有用的功能是在某些情况变为真时停止读取。这可以通过简单地false从回调函数返回来实现。

例如,我们可以逐行读取文件,直到找到其中包含单词“ STOP”的行:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
lineReader.eachLine('path/to/file', function(line) {
    console.log(line);
    if (line.includes('STOP') {
        return false; // stop reading
    }
});

有一种稍微不同的方法,它使用两个嵌套的回调和语法,对于那里的Java开发人员来说似乎更自然:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
lineReader.open('/path/to/file', function(reader) {
    if (reader.hasNextLine()) {
        reader.nextLine(function(line) {
            console.log(line);
        });
    }
});

在这里,我们正在使用该open()函数,它不会立即为我们提供文件中的行,而是为我们提供了reader。它有自己的一组功能,例如hasNextLine()nextLine(),这些功能使我们可以对Node.js中逐行读取文件的过程进行更多控制。

N-二readlines方法

npm模块提供了不同的语法n-readlines

让我们安装它:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
$ npm install --save n-readlines

并要求它:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
const lineByLine = require('n-readlines');

为了能够读取文件,我们应该创建一个新对象,并提供一个指向文件的路径作为参数:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
const liner = new lineByLine('/path/to/file');

通过调用以下next函数从文件中获取行:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
let line;
 
while (line = liner.next()) {
    console.log(line);
}

n-readlines模块的一个有趣功能是reset()。它会重置指针并从文件的最开始开始读取过程。

注意:仅在未达到结尾时才起作用。

常见错误

在Node.js中逐行读取文件时,常见的错误是将整个文件读取到内存中,然后通过换行符分割其内容。

这是一个不正确的示例,如果提供足够大的文件,可能会使系统过载:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
require('fs').readFileSync('/path/to/file', 'utf-8').split(/\r?\n/).forEach(function(line) {
    console.log(line);
});

乍一看,这种方法的输出与以前的方法看起来是相同的,实际上,对于小文件来说,它的工作效果很好。但是,请继续尝试与大公司合作。绝对不是您想在生产系统中看到的东西。

结论

在Node.js中有多种方式逐行读取文件,选择适当的方法完全是程序员的决定。

您应该考虑计划要处理的文件的大小,性能要求,代码样式以及项目中已经存在的模块。确保在一些极端情况下进行测试,例如巨大,空白或不存在的文件,并且最好使用提供的任何示例。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
在Node.js中如何逐行读取文件
本文翻译自How to read a file line by line in Node.js
ccf19881030
2020/10/29
14.8K0
如何在Java中逐行读取文件
本文翻译自How to read a file line by line in Java
ccf19881030
2020/11/24
11.7K0
Node.js
主要学习:JavaScript+Node.js内置API模块(fs、path、http等)+第三方API模块(express、mysql等)
岳泽以
2022/11/21
8.3K0
Node.js
【Node.JS】读取文件内容
fs模块是Node.js官方提供的,用来操作文件的模块,它提供了一系列的方法和属性,用来满足用户对文件的操作需求,
坚毅的小解同志的前端社区
2022/11/28
12.3K0
【Node.JS】读取文件内容
在Node.js中读写文件
本文翻译自Reading and Writing Files in Node.js
ccf19881030
2020/10/29
5.9K0
必应API接口node.js版 - 极客玩家大白
近期,在研究百度、必应、API等的url提交API时,发现有用Go语言做工具的大佬的分享 利用 API 自动向搜索引擎提交网址(Go语言版) - pyList。
Enjoy233
2020/09/17
1.2K0
必应API接口node.js版 - 极客玩家大白
如何从Node.js中的命令行读取输入
您是否正在使用Node.js中开发一个小的CLI工具,并希望能够提示用户从命令行输入输入? Node.js正是为此目的提供了readline模块。 它提供了一个接口,用于从可读流(例如process.stdin)中一次读取一行数据。
ccf19881030
2020/10/26
9.3K0
Nodejs进阶:readline实现日志分析+简易命令行工具
模块概览 readline是个非常实用的模块。如名字所示,主要用来实现逐行读取,比如读取用户输入,或者读取文件内容。常见使用场景有下面几种,本文会逐一举例说明。本文相关代码可在笔者github上找到。
IMWeb前端团队
2017/12/28
1.4K0
这里有一份Node.js入门指南和实践,请注意查收
JS 是脚本语言,脚本语言都需要一个解析器才能运行。对于写在 HTML 页面里的 JS,浏览器充当了解析器的角色。而对于需要独立运行的 JS,NodeJS 就是一个解析器。
null仔
2020/02/28
3.8K0
这里有一份Node.js入门指南和实践,请注意查收
node.js笔记
4、语法: 1)加载 path 模块 2)使用 path.join 方法,拼接路径
打不着的大喇叭
2024/03/11
2230
node.js笔记
Node.js 基础入门
Node.js 是一个基于 Chrome V8 引擎 的 JavaScript 运行时环境
王秀龙
2021/08/23
1.6K0
Node.js 基础入门
Node.js学习笔记(二)——Node.js模块化、文件读写、环境变量
(1)、在浏览器端使用var或不使用关键字定义的变量属于全局作用域,也就是可以使用window对象访问。
张果
2022/09/28
6.5K0
Node.js学习笔记(二)——Node.js模块化、文件读写、环境变量
node.js基础入门
node.js是一个基于Google V8引擎的、跨平台的JavaScript运行环境,不是一个语言
黄啊码
2022/06/20
8320
如何使用 Node.js 代码下载 Github issue 到本地
国内的开发者们,有使用 github 上开源的代码仓库上通过提交 issue 的方式进行一些技术或者非技术层面的讨论。
编程小妖女
2025/01/03
2810
如何使用 Node.js 代码下载 Github issue 到本地
《Node.js 极简教程》 东海陈光剑
Once you have installed Node, let's try building our first web server. Create a file named "app.js", and paste the following code:
一个会写诗的程序员
2019/02/22
1.7K0
《Node.js 极简教程》  东海陈光剑
Node.js快速入门
下载最新版源码:https://nodejs.org/dist/v6.9.5/node-v6.9.5.tar.gz
程裕强
2022/05/06
11.9K0
Node.js的基本使用
Vscode中的Node.js代码提示插件: npm install –save-dev @types/node
小城故事
2024/08/24
2050
Node.js基础
浏览器(软件)能够运行JavaScript代码,浏览器就是JavaScript代码的运行环境
星辰_大海
2020/10/29
1.9K0
Node.js基础
如何使用Java逐行读取大文本文件?
这是一个示例,该示例具有完整的错误处理并支持Java 7之前的字符集规范。使用Java 7,您可以使用try-with-resources语法,从而使代码更简洁。
用户7886150
2020/12/11
3.1K0
【Node.JS 练习】时钟案例
 将素材目录下的index.html页面,拆分成三个文件,分别是:index.css,index.js,index.html
坚毅的小解同志的前端社区
2022/11/28
2.8K0
【Node.JS 练习】时钟案例
相关推荐
在Node.js中如何逐行读取文件
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验