我尝试过这样的事情
file_in <- file("myfile.log","r")
x <- readLines(file_in, n=-100)
但我还在等......
非常感谢任何帮助
答案 0 :(得分:9)
如果您知道日志有多少行,我会使用scan
:
scan("foo.txt",sep="\n",what="char(0)",skip=100)
如果你不知道你需要跳过多少,你别无选择,只能走向
scan("foo.txt",sep="\n",what=list(NULL))
计算出有多少记录,或最后一个选项可能如下:
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
命令。
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)