专栏首页Web行业观察在Node.js中逐行读取文件【纯技术】
原创

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

介绍

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

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

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

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

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

Readline(从v0.12开始)

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

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

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

const readline = require('readline');

你很高兴去!

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

const fs = require('fs');

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

const readInterface = readline.createInterface({
    input: fs.createReadStream('/path/to/file'),
    output: process.stdout,
    console: false
});

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

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

readInterface.on('line', function(line) {
    console.log(line);
});

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

在线阅读器

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

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

$ npm install --save line-reader

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

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

const lineReader = require('line-reader');

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

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

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

lineReader.eachLine('path/to/file', function(line) {
    console.log(line);
    if (line.includes('STOP') {
        return false; // stop reading
    }
});

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

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

让我们安装它:

$ npm install --save n-readlines

并要求它:

const lineByLine = require('n-readlines');

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

const liner = new lineByLine('/path/to/file');

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

let line;
 
while (line = liner.next()) {
    console.log(line);
}

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

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

常见错误

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

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

require('fs').readFileSync('/path/to/file', 'utf-8').split(/\r?\n/).forEach(function(line) {
    console.log(line);
});

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

结论

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

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

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

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

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 整数编码之 ZigZag

    在分析Avro源码时,发现Avro为了对int、long类型数据压缩,采用Protocol Buffers的ZigZag编码(Thrift也采用了ZigZag来...

    Jean
  • IEEE浮点数的设计缺陷

    在生物化学中,“信息”是研究物质的2个基本视角之一,另外一个是“能量”。因为信息和能量都是抽象出来的东西,以它们为视角研究现实世界的成本非常低,比如计算机专业的...

    Jean
  • Mac下禁用一些高占用的进程

    晚上在 terminal 里敲代码,发现系统异常的卡顿。在 Activity Monitor 里发现 ReportCrash 进程占用了大量的 CPU

    Jean
  • 算法(二)蓄水池抽样算法快速随机抽取reads

    fastq文件往往都很大,出于测试目的,我们经常要从fastq文件中随机抽取reads,生成一个小一点的fastq文件,以加快测试效率。假设我们要从一个包含大约...

    一只羊
  • spark System memory must be at least

    机器学习和大数据挖掘
  • 深入理解 Go map:赋值和扩容迁移

    在 上一章节 中,数据结构小节里讲解了大量基础字段,可能你会疑惑需要 #&(!……#(!¥! 来干嘛?接下来我们一起简单了解一下基础概念。再开始研讨今天文章的重...

    李海彬
  • Mac基于ffmpeg视频压缩与格式转换

    -i 输入文件的路径或者url; -s 设置输出文件的分辨率,wxh; -b:v 输出文件的码率,一般500k左右即可,人眼看不到明显的闪烁,这个是与视频大...

    程序员不务正业
  • 08 Confluent_Kafka权威指南 第八章:跨集群数据镜像

    本书大部分内容都在讨论单个kafka集群的配置、维护和使用。但是,在一些场景中,可能需要多集群架构。 在某些情况下,集群是完全分离的,他们属于不同部门的不同实...

    冬天里的懒猫
  • Android网络访问库 - Retrofit学习(1)基础

    Retrofit是一个类型安全的HTTP客户端,支持Android和Java.它是Square公司开源的项目,当前版本2.0。

    zhangyunfeiVir
  • apache 301重定向和禁止访问指定后缀文件

    #301重定向 RewriteEngine on RewriteCond %{HTTP_HOST} www.phpfs.com$ [NC] RewriteR...

    苦咖啡

扫码关注云+社区

领取腾讯云代金券