Извлечение данных из текстовых файлов
похоже, что подобные вопросы есть и на других языках, но я не могу найти их в 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 раз.
строка "количество декартовых гауссовых базисных функций =" уникальна для каждого файла; т. е., если я открою файл в текстовом редакторе и выполню поиск с помощью этой строки, Я верну только эту строку. Аналогично для "информации о синхронизации ЦП для всех процессов"и" вышел изящно".
Я понимаю, что кажется, что я не сделал много, чтобы помочь мне но я просто не знаю с чего начать. Если кто-то может мне точку в правильном направлении, я надеюсь чтобы иметь возможность заполнить остальные.
после помощи, предоставленной мне @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.
1 ответов
может быть
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
The sapply
транспонировал матрицу значений, поэтому последняя строка-это бит, который мы хотим (соответствует последнему столбцу в файле). Извлеките его с помощью numstr[4,]
или numstr[nrow(numstr),]
или tail(numstr,1)
.
(редактировать: разрешить пробелы перед строкой "синхронизация ЦП") (редактировать: делайте это правильно!)
(сделать это для всех файлов журналов, упаковки в функции и используйте list.files(pattern="\.log$")
в сочетании с sapply
...)