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

时间:2011-04-08 13:52:05

标签: windows r file-io

我尝试过这样的事情

file_in <- file("myfile.log","r")
x <- readLines(file_in, n=-100)

但我还在等......

非常感谢任何帮助

6 个答案:

答案 0 :(得分:9)

如果您知道日志有多少行,我会使用scan

scan("foo.txt",sep="\n",what="char(0)",skip=100)

如果你不知道你需要跳过多少,你别无选择,只能走向

  • 阅读所有内容并采用最后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
}

允许:

ReadLastLines("foo.txt",100)

ReadLastLines("foo.txt",100,skip=1e+7)

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


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

答案 1 :(得分:4)

您可以通过指定read.table参数,使用skip执行此操作。如果你的行不被解析为变量,那么将@Joris Meys指出的分隔符​​指定为'\n',并设置as.is=TRUE以获取字符向量而不是因子。

小例子(跳过前2000行):

df <- read.table('foo.txt', sep='\n', as.is=TRUE, skip=2000)

答案 2 :(得分:2)

您可以通过以下方法读取最后n行

第1步-根据需要打开文件 df <- read.csv("hw1_data.csv")

第2步-现在使用tail函数从最后读取n行

tail(df, 2)

答案 3 :(得分:0)

正如@JorisMeys已经提到的,unix命令tail将是解决此问题的最简单方法。但是,我想提出一个基于seek的{​​{1}}解决方案,该解决方案从文件末尾开始读取文件:

R

答案 4 :(得分:0)

查看最后几行:

tail(file_in,100) 

答案 5 :(得分:0)

有些人已经说过了,但是如果您有一个大日志,那么只读取您需要的内容是最有效的,而不是将其全部读取到内存中,然后再细分您需要的内容。

为此,我们使用 R 的 system() 来运行 Linux tail 命令。

读取日志的最后 10 行:

system("tail path/to/my_file.log")

读取日志的最后两行:

system("tail -n 2 path/to/my_file.log")

读取日志的最后两行并以字符向量的形式捕获输出:

last_2_lines <- system("tail -n 2 path/to/my_file.log", intern = TRUE)