2013-07-08 23 views
0

我試圖從非常大的文本文件(計算機日誌)中提取表。 Dickoa在此處提供了有關此主題的早期問題的非常有用的建議:extracting table from text file在一列中使用空格讀表

我修改了他的建議以適合我的具體問題,並在上​​面的鏈接中發佈了我的代碼。

不幸的是我遇到了一個併發症。表中的一列包含空格。當我嘗試在上面的鏈接上運行代碼時,這些空格會產生錯誤。是否有修改該代碼的方法,或者是否將read.table函數識別爲列中的第二列?

這裏是一個虛擬日誌的虛擬表:

> collect.models(, adjust = FALSE) 
                      model npar  AICc DeltaAICc  weight Deviance 
5 AA(~region + state + county + city)BB(~region + state + county + city)CC(~1) 17 11111.11 0.0000000 5.621299e-01 22222.22 
4     AA(~region + state + county)BB(~region + state + county)CC(~1) 14 22222.22 0.0000000 5.621299e-01 77777.77 
12         AA(~region + state)BB(~region + state)CC(~1) 13 33333.33 0.0000000 5.621299e-01 44444.44 
12             AA(~region)BB(~region)CC(~1) 6 44444.44 0.0000000 5.621299e-01 55555.55 
> 
> # the three lines below count the number of errors in the code above 

這裏是R代碼,我嘗試使用。此代碼的工作,如果有第二列沒有空格,模型柱:

my.data <- readLines('c:/users/mmiller21/simple R programs/dummy.log') 

top <- '> collect.models\\(, adjust = FALSE)' 
bottom <- '> # the three lines below count the number of errors in the code above' 

my.data <- my.data[grep(top, my.data):grep(bottom, my.data)] 

x <- read.table(text=my.data, comment.char = ">") 

我相信我必須使用變量topbottom找到日誌中的表,因爲日誌是巨大的,可變的,複雜的。另外,並非每個表格都包含相同數量的模型。

也許一個正則表達式可以在某種程度上利用每個型號名稱中存在的AACC(~1),但我不知道如何開始。感謝您的幫助,併爲後續問題感到抱歉。我應該在最初的問題中使用更現實的示例表。我有大量的日誌。否則我可以手工提取和編輯表格。桌子本身是一個奇怪的物體,我只能用capture.output直接輸出,這可能仍然會帶來與上述相同的問題。

編輯:

所有的空格似乎是在加號前和加號後出現的。也許這些信息可以用來填充空間或刪除它們。

回答

1

嘗試read.table

my.data <- my.data[grep(top, my.data):grep(bottom, my.data)] 

my.data$model <- gsub(" *\\+ *", "+", my.data$model) 

x <- read.table(text=my.data, comment.char = ">") 
+0

之前插入my.data$model <- gsub(" *\\+ *", "+", my.data$model)可能是很好用'更換的情況下 「+ 」'和'「 +」',另外,萬一有在間距不一致。 – Thomas

+0

@Ricardo薩波塔謝謝。這幾乎奏效。我不得不將一行改爲:my.data < - gsub(「\\ +」,「+」,my.data)然後我必須在read.table中設置row.names = NULL。 –

+0

馬克,很高興它幫助。另請參閱編輯 –