2013-03-11 33 views
1

我有一個可怕的格式化日誌文件(我無法更改它是如何創建的),我希望對其進行一些分析。R讀取並轉換文件中的行

我有一個正則表達式匹配日誌文件中的特定行。這些行包含我想要在分析前提取並放入矩陣的數據(字符串和數字,這些數據將被RegEx中的匹配組捕獲)。

完成此操作的最佳方法是什麼?使用gsub函數可能? (我對R很陌生)

編輯,以解決評論。

我不能發佈日誌文件的內容,但我可以給我想要一個例子:

我的日誌文件看起來像這樣:

.... 
[Node_1] sometext [Ref:1111111, Strategy:4] Initialise Class1 
[Node_1] sometext [Ref:1111111, Strategy:4] Initialise Class1 - 3432ms 
some non relevant text 
more non relevant text 
[Node_4] sometext [Ref:1133311, Strategy:5] Run Class76 
[Node_4] sometext [Ref:1133311, Strategy:6] Run Class76 - 5432ms 
.... 

我只希望在行讀它們在最後有定時,我希望矩陣中的對應行包含行中的數據位。

所以,如果我正則表達式是這樣的:

^\[([^]]*)\][^[]*\[([^]]*)\] (Initialise|Run) (Class[0-9]+) - ([0-9]+)ms$ 

我想在矩陣行是

\1,\2,\4,\5 

IE在日誌文件中的2號線,在矩陣中的行內容如下:

Node_1, "Ref:1111111, Strategy:4", Class1, 3432 
+2

請告訴我們您的日誌文件,你的正則表達式模式和所需輸出的(小),例如,然後我們可以附和(編輯原帖,請勿將其粘貼在評論中)。 – Arun 2013-03-11 13:35:02

+1

@阿倫,感謝您的期待,我添加了您要求的相關信息。 – Griffin 2013-03-11 14:11:51

回答

2

strapplycgsubfn包可以拉出捕獲:

pat <- 
"^\\s*\\[([^]]*)\\][^[]*\\[([^]]*)\\] (Initialise|Run) (Class[0-9]+) - ([0-9]+)ms$" 

Lines <- ".... 
[Node_1] sometext [Ref:1111111, Strategy:4] Initialise Class1 
[Node_1] sometext [Ref:1111111, Strategy:4] Initialise Class1 - 3432ms 
some non relevant text 
more non relevant text 
[Node_4] sometext [Ref:1133311, Strategy:5] Run Class76 
[Node_4] sometext [Ref:1133311, Strategy:6] Run Class76 - 5432ms 
...." 

# read in file 
Lines2 <- readLines(textConnection(Lines)) 
closeAllConnections() 

# extract lines ending in ms 
Lines3 <- grep("ms$", Lines2, value = TRUE) 

# pull out captures 
library(gsubfn) 
strapplyc(Lines3, pat, simplify = "rbind")[, -3] 

最後一行的結果是:

 [,1]  [,2]      [,3]  [,4] 
[1,] "Node_1" "Ref:1111111, Strategy:4" "Class1" "3432" 
[2,] "Node_4" "Ref:1133311, Strategy:6" "Class76" "5432" 
+0

完美,謝謝。 – Griffin 2013-03-11 15:33:50

相關問題