前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >在Node.js中逐行读取文件【纯技术】

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

原创
作者头像
Jean
修改2019-09-24 17:25:34
7.8K0
修改2019-09-24 17:25:34
举报
文章被收录于专栏:Web行业观察

介绍

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

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

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

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

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

Readline(从v0.12开始)

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

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

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

代码语言:javascript
复制
const readline = require('readline');

你很高兴去!

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

代码语言:javascript
复制
const fs = require('fs');

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

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

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

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

代码语言:javascript
复制
readInterface.on('line', function(line) {
    console.log(line);
});

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

在线阅读器

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

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

代码语言:javascript
复制
$ npm install --save line-reader

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

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

代码语言:javascript
复制
const lineReader = require('line-reader');

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

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

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

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

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

代码语言:javascript
复制
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
复制
$ npm install --save n-readlines

并要求它:

代码语言:javascript
复制
const lineByLine = require('n-readlines');

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

代码语言:javascript
复制
const liner = new lineByLine('/path/to/file');

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

代码语言:javascript
复制
let line;
 
while (line = liner.next()) {
    console.log(line);
}

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

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

常见错误

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

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

代码语言:javascript
复制
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 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 介绍
  • Readline(从v0.12开始)
  • 在线阅读器
  • N-二readlines方法
  • 常见错误
  • 结论
相关产品与服务
腾讯云 TI 平台
腾讯云 TI 平台(TencentCloud TI Platform)是基于腾讯先进 AI 能力和多年技术经验,面向开发者、政企提供的全栈式人工智能开发服务平台,致力于打通包含从数据获取、数据处理、算法构建、模型训练、模型评估、模型部署、到 AI 应用开发的产业 + AI 落地全流程链路,帮助用户快速创建和部署 AI 应用,管理全周期 AI 解决方案,从而助力政企单位加速数字化转型并促进 AI 行业生态共建。腾讯云 TI 平台系列产品支持公有云访问、私有化部署以及专属云部署。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档