Node.js 一行一行地读取文本文件

Node.js 一行一行地读取文本文件

在 Node.js 中读取文本文件,我们经常使用的是:

  1. fs.readFile
  2. fs.createReadStream

但这 2 个方法都没有对按行读取的支持,怎么办?

Node.js 内置了一个 readline 模块,可以实现这个。

更详细的情景说明,我写了 一篇文章


6 回复

额,不是可以 fs.open 然后 fs.read ?

前阵子刚用到 readline,我分享下我碰到的问题。
公司的环境是 node v10.15 的,发现这版本 readline.createInterface 创建出来的不是 async iterator 对象,无法对他 for await 遍历(v10.16 可以,就差 0.1 版本,哭)。领导还不让升级,因为是生产环境下要跑的脚本,不能随便升 node 版本。
这里我的做法是用 stream.PassThrough 套一层,readline 读出来的数据写进 stream 里,然后 for await 这个 stream 对象。
function readliner () {
const output = new stream.PassThrough({ objectMode: true })
const rl = readline.createInterface({
input: fs.createReadStream(‘filepath’)
})

rl.on(‘line’, async (line) => {
output.write(line)
})
rl.on(‘close’, () => {
output.push(‘end’)
});
return output
}

注意:rl.on(‘close’) 事件里写个 end 标记进去,以便再外层遍历的时候碰到 end 标记了可以 break 掉

一般什么功能 找找 npm 网站 99%可以解决
https://www.npmjs.com/package/line-read

在Node.js中,一行一行地读取文本文件通常使用内置的fs模块与readline模块来实现。fs模块用于文件系统操作,而readline模块则提供了逐行读取文件内容的接口。

以下是一个示例代码,展示了如何使用这两个模块来逐行读取一个文本文件:

const fs = require('fs');
const readline = require('readline');

const filePath = 'path/to/your/file.txt';

const readStream = fs.createReadStream(filePath);

const rl = readline.createInterface({
  input: readStream,
  crlfDelay: Infinity
});

rl.on('line', (line) => {
  console.log(`Line from file: ${line}`);
});

rl.on('close', () => {
  console.log('File has been read completely.');
});

在这段代码中:

  1. 使用fs.createReadStream方法创建一个读取流。
  2. 使用readline.createInterface方法创建一个接口,将读取流作为输入。
  3. 监听line事件,每当读取到一行内容时,就会触发这个事件,并回调处理每行的内容。
  4. 监听close事件,当文件读取完成时触发,可以在这里执行一些清理操作或后续逻辑。

filePath替换为你的文本文件的实际路径,然后运行这段代码,就可以逐行读取并打印文件内容了。

回到顶部