7

他の言語でもこれと同様の質問があるようですが、R では見つかりません。

ディレクトリのサブディレクトリに多数のテキスト ファイルがあります。それらはすべて拡張子 (.log) を持ち、テキストとデータが混在しています。これらの比較的大きなファイルから数行を抽出したいと考えています。

たとえば、1つのファイルは次のようになります...

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 時間の合計を取得したいと考えています。

行「NUMBER OF CARTESIAN GAUSSIAN BASIS FUNCTIONS =」は各ファイルに固有です。つまり、テキスト エディタでファイルを開き、この文字列を使用して検索すると、この 1 行しか返されません。「すべてのプロセスの 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"))
}

この関数をソースとして使用し、毎回必要なファイルを入力してから、2 つの結果を手動で別のファイルに転送しました。私が望むほどエレガントではありませんが、このようにすることで多くの時間を節約できました。@ベンに再び感謝します。

4

1 に答える 1

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ます)

于 2013-01-10T16:11:26.700 に答える