javascript 如何使用NodeJS从底部逐行读取文件?

hgqdbh6s  于 2023-05-12  发布在  Java
关注(0)|答案(1)|浏览(195)

我有一个很长的日志文件,需要从底部逐行读取,当满足某个条件时停止,然后返回该行。这也需要在Windows上工作。这个文件可能会很长,所以我不想读取整个文件,然后反转它。
我目前正在使用reverse-line-reader,但它自2015年以来一直没有更新,异步功能还有很多需要改进的地方。
我见过的所有其他包都是archivedrequires me to know the number of lines I want ahead of timeor doesn't process by lines
在vanilla Node中有没有什么方法可以做到这一点,或者有没有一个我没有见过的包可以满足我的需要?
当前代码,如果它对解释我需要什么有帮助的话:

reverseLineReader.eachLine(this.#path, (raw: string, last: boolean) => {
    if (raw) { // skip blank line at end of file
        const line = JSON.parse(raw)

        if (line.event === 'FSDJump') {
            this.location = new System(line)
            Log.write(`Current location set to ${this.location.name}.`)
            this.emit('ENTERED_NEW_SYSTEM')
            return false // stop reading

        } else if (last) {
            log('Unable to find last hyperspace jump. Searching for last known location.')
            return false
        }
    }
})

谢谢!

tjvv9vkg

tjvv9vkg1#

下面是一个readBackwards方法的基本vanilla节点实现,该方法从文件末尾读取多个字节。
为了简单起见,它打开文件,使用stat获取文件大小,然后使用read,并从文件末尾计算偏移量。
如果需要从文件末尾读取更多内容,则应在方法外部调用stat,并将大小作为参数传递,以免不必要地频繁调用stat。然后,您可以在每次迭代中基本上增加positionFromEnd,增加缓冲区的大小,使其从文件的末尾滑动到文件的开头。

const fs = require("fs");
const { Buffer } = require("buffer");

function readBackwards(
  file,
  buffer,
  offsetInBuffer,
  length,
  positionFromEnd,
  callback
) {
  fs.open(file, "r", 0666, (err, fd) => {
    if (err) return callback(err);

    fs.fstat(fd, (err, stat) => {
      if (err) return callback(err);

      fs.read(
        fd,
        buffer,
        offsetInBuffer,
        length,
        Math.max(stat.size - length - positionFromEnd, 0),
        (err, bytesRead, buffer) => {
          if (err) return callback(err);

          fs.close(fd, (err) => {
            return callback(err, bytesRead, buffer);
          });
        }
      );
    });
  });
}

在这里试试:https://codesandbox.io/p/sandbox/loving-mestorf-hgro1p?file=%2Findex.js%3A8%2C13
编辑:要逐行读取,您需要在迭代过程中连接所读取的内容,直到出现第一个换行符。然后在换行符处进行拆分,并在从文件中阅读更多内容之前处理那些已完成的行。

相关问题