从一个巨大的文本文件中读取最后n行

Geo*_*tas 6 windows file-io r

我尝试过这样的事情

file_in <- file("myfile.log","r")
x <- readLines(file_in, n=-100)
Run Code Online (Sandbox Code Playgroud)

但我还在等......

任何帮助将不胜感激

Jor*_*eys 9

我会用scan它,以防您知道日志有多少行:

scan("foo.txt",sep="\n",what="char(0)",skip=100)
Run Code Online (Sandbox Code Playgroud)

如果你不知道你需要跳过多少,你别无选择,只能走向其中任何一个

  • 阅读所有内容并采用最后n行(如果可行的话),
  • 使用scan("foo.txt",sep="\n",what=list(NULL))找出多少记录有,或
  • 使用一些算法来浏览文件,每次只保留最后n行

最后一个选项可能如下所示:

ReadLastLines <- function(x,n,...){    
  con <- file(x)
  open(con)
  out <- scan(con,n,what="char(0)",sep="\n",quiet=TRUE,...)

  while(TRUE){
    tmp <- scan(con,1,what="char(0)",sep="\n",quiet=TRUE)
    if(length(tmp)==0) {close(con) ; break }
    out <- c(out[-1],tmp)
  }
  out
}
Run Code Online (Sandbox Code Playgroud)

允许:

ReadLastLines("foo.txt",100)
Run Code Online (Sandbox Code Playgroud)

要么

ReadLastLines("foo.txt",100,skip=1e+7)
Run Code Online (Sandbox Code Playgroud)

如果你知道你有超过1000万行.当你开始拥有非常大的日志时,这可以节省阅读时间.


编辑:事实上,考虑到文件的大小,我甚至不会使用R. 在Unix上,您可以使用tail命令.还有一个Windows版本,在工具箱中的某个地方.虽然我还没试过.

  • `while(TRUE)` 会更容易理解 - 不依赖于逻辑的内部强制。 (2认同)