gpt4 book ai didi

go - 如何使用 Go 每 10 秒读取一个大文件的最后一行

转载 作者:IT老高 更新时间:2023-10-28 13:08:54 30 4
gpt4 key购买 nike

如何在不完全加载到内存的情况下从大日志文件中读取最后两行?

我需要每 10 秒阅读一次(在 Win 机器上)...我一直在尝试阅读最后几行...

package main

import (
"fmt"
"time"
"os"
)

const MYFILE = "logfile.log"

func main() {
c := time.Tick(10 * time.Second)
for now := range c {
readFile(MYFILE)
}
}

func readFile(fname string){
file, err:=os.Open(fname)
if err!=nil{
panic(err)
}
buf:=make([]byte, 32)
c, err:=file.ReadAt(32, ????)
fmt.Printf("%s\n", c)


}

日志文件类似于:

07/25/2013 11:55:42.400, 0.559
07/25/2013 11:55:52.200, 0.477
07/25/2013 11:56:02.000, 0.463
07/25/2013 11:56:11.800, 0.454
07/25/2013 11:56:21.600, 0.424
07/25/2013 11:56:31.400, 0.382
07/25/2013 11:56:41.200, 0.353
07/25/2013 11:56:51.000, 0.384
07/25/2013 11:57:00.800, 0.393
07/25/2013 11:57:10.600, 0.456

谢谢!

最佳答案

您可以使用 file.Seek()file.ReadAt()到几乎结束,然后阅读前进。你只能估计从哪里开始寻找,除非你知道 2 行 = x 字节。

您可以使用 os.Stat(name) 获取文件长度

这是一个基于 ReadAt、Stat 和您的示例日志文件的示例:

package main

import (
"fmt"
"os"
"time"
)

const MYFILE = "logfile.log"

func main() {
c := time.Tick(10 * time.Second)
for _ = range c {
readFile(MYFILE)
}
}

func readFile(fname string) {
file, err := os.Open(fname)
if err != nil {
panic(err)
}
defer file.Close()

buf := make([]byte, 62)
stat, err := os.Stat(fname)
start := stat.Size() - 62
_, err = file.ReadAt(buf, start)
if err == nil {
fmt.Printf("%s\n", buf)
}

}

关于go - 如何使用 Go 每 10 秒读取一个大文件的最后一行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17863821/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com