Извлечение данных из текстовых файлов

Похоже, на другие языки есть похожие вопросы, но я не могу найти их в 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 в этом примере) и общее количество процессорного времени.

Строка "NUMBER OF CARTESIAN GAUSSIAN BASIS FUNCTIONS =" уникальна для каждого файла; то есть, если я открою файл в текстовом редакторе и выполню поиск по этой строке, я верну только эту строку. Аналогично для "информации о времени процессора для всех процессов" и "изящно завершено".

Я ценю то, что мне кажется, что я мало что сделал, чтобы помочь себе, но я просто не знаю, с чего начать. Если кто-то может указать мне правильное направление, я надеюсь, что смогу заполнить все остальное.

После помощи, которую мне дал @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

sapply переставил матрицу значений, поэтому последняя строка - это бит, который мы хотим (соответствует последнему столбцу в файле). Извлеките его, используя numstr[4,] или же numstr[nrow(numstr),] или же tail(numstr,1),

(edit: разрешить пробелы перед строкой "CPU time") (edit: сделать это правильно!)

(Чтобы сделать это для всех файлов журнала, упакуйте его в функцию и используйте list.files(pattern="\\.log$") в комбинации с sapply...)

Другие вопросы по тегам