在其他语言中似乎有类似的问题,但我在R中找不到一个。
我在目录的子目录中有许多文本文件;它们都有扩展名(.log),它们包含文本和数据的混合。我想从这些相对较大的文件中提取几行。
例如,一个文件如下...
blahblahblah
NUMBER OF CARTESIAN GAUSSIAN BASIS FUNCTIONS = 210
blahblahblah
----------------------------------------<br />
CPU timing information for all processes<br />
========================================<br />
0: 8853.469 + 133.948 = 8987.417<br />
1: 8850.817 + 126.587 = 8977.405<br />
2: 8851.925 + 128.576 = 8980.501<br />
3: 8847.992 + 125.871 = 8973.864<br />
----------------------------------------<br />
ddikick.x: exited gracefully.<br />
blahblahblah
我想收集基本函数的数量(本例中为210)和CPU时间总量。
“CARTESIAN GAUSSIAN BASIS FUNCTIONS数量=”这一行对每个文件都是唯一的;即,如果我在文本编辑器中打开文件并使用此字符串进行搜索,我只返回这一行。类似地,“所有进程的CPU时序信息”和“优雅地退出”。
我很欣赏我似乎没有做很多事情来帮助自己,但我不知道从哪里开始。如果有人能指出我正确的方向,我希望能够填补其余部分。
在@Ben给我的帮助之后(见下文),这里是我最终使用的代码,
filesearch <- function (x) {
f <- readLines(x)
cline <- grep("NUMBER OF CARTESIAN GAUSSIAN BASIS FUNCTIONS",f,
value=TRUE)
val <- as.numeric(str_extract(cline,"[0-9]+$"))
coline <- grep("^ +CPU timing information", f)
numstr <- sapply(str_extract_all(f[coline+2:5],"[0-9.]+"),as.numeric)
cline1 <- sum(numstr[4,])/60
output <- c(val, cline1)
return(cat(output,"\n"))
}
我找到了这个函数并且每次都输入了我需要的文件,然后我手动将这两个结果转移到另一个文件中。不像我想的那样优雅,但它节省了我很多时间这样做。再次感谢@Ben。
答案 0 :(得分:7)
也许
library(stringr)
f <- readLines("datafile.txt")
cline <- grep("NUMBER OF CARTESIAN GAUSSIAN BASIS FUNCTIONS",f,
value=TRUE)
val <- as.numeric(str_extract(cline,"[0-9]+$"))
会起作用吗?
要获取其他值,请尝试
cline <- grep("^ +CPU timing information",f)
(numstr <- sapply(str_extract_all(f[cline+2:5],"[0-9.]+"),as.numeric))
## [,1] [,2] [,3] [,4]
## [1,] 0.000 1.000 2.000 3.000
## [2,] 8853.469 8850.817 8851.925 8847.992
## [3,] 133.948 126.587 128.576 125.871
## [4,] 8987.417 8977.405 8980.501 8973.864
sapply
已经转换了值矩阵,因此最后一行是我们想要的位(对应于文件中的最后一列)。使用numstr[4,]
或numstr[nrow(numstr),]
或tail(numstr,1)
(编辑:在“CPU计时”字符串之前允许空格) (编辑:做得对!)
(要对所有日志文件执行此操作,请将其打包到函数中,并将list.files(pattern="\\.log$")
与sapply
结合使用...)