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

  • 2019 年 10 月 6 日
  • 筆記

介绍

在计算机科学中,文件是一种资源,用于在计算机的存储设备中离散地记录数据。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中有多种方式逐行读取文件,选择适当的方法完全是程序员的决定。

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