我有一个很长的日志文件,需要从底部逐行读取,当满足某个条件时停止,然后返回该行。这也需要在Windows上工作。这个文件可能会很长,所以我不想读取整个文件,然后反转它。
我目前正在使用reverse-line-reader,但它自2015年以来一直没有更新,异步功能还有很多需要改进的地方。
我见过的所有其他包都是archived,requires me to know the number of lines I want ahead of time,or 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
}
}
})
谢谢!
1条答案
按热度按时间tjvv9vkg1#
下面是一个
readBackwards
方法的基本vanilla节点实现,该方法从文件末尾读取多个字节。为了简单起见,它打开文件,使用stat获取文件大小,然后使用read,并从文件末尾计算偏移量。
如果需要从文件末尾读取更多内容,则应在方法外部调用stat,并将大小作为参数传递,以免不必要地频繁调用stat。然后,您可以在每次迭代中基本上增加
positionFromEnd
,增加缓冲区的大小,使其从文件的末尾滑动到文件的开头。在这里试试:https://codesandbox.io/p/sandbox/loving-mestorf-hgro1p?file=%2Findex.js%3A8%2C13
编辑:要逐行读取,您需要在迭代过程中连接所读取的内容,直到出现第一个换行符。然后在换行符处进行拆分,并在从文件中阅读更多内容之前处理那些已完成的行。