2014-09-05 106 views
5

我有一堆輸出.txt文件,它由大型參數列表和X-Y座標集組成。我需要從所有文件中提取這些座標,以便只將這些行導入到矢量中。這將很好地工作R - 在特定行後讀取.txt文件中的行

impcoord<-read.table("file.txt",skip= ,nrow= ,...) 

但文件支持參數的不同長度後打印的座標集。

幸運的是,座標始終在包含某些單詞的行後面開始。

因此,我的問題是,如何在這些字詞之後開始閱讀.txt文件?假設他們是:

coordinatesXY 

非常感謝您的時間和幫助!

-Olli

- 編輯 -

很抱歉的混亂。

該文件的部分如下:

##XYDATA= (X++(Y..Y)) 
131071 -2065 
131070 -4137 
131069 -6408 
131068 -8043 
...  ... 
...  ... 

第一行是所述一個其中skip應該結束並下列座標需要被導入到載體中。正如你所看到的X座標從131071開始和結束時0

+1

還有更多的文件,你的問題從我的帖子中提到了一個以## END ='開始的行,是座標行之後的那一行嗎? – JeremyS 2014-09-08 01:10:03

+0

是。也許我應該將'nrow ='併入參數行? – 2014-09-08 05:56:57

回答

6

1)read.patternread.pattern gsubfn可以用來只讀取符合特定模式的行。在這個例子中,我們匹配行首,可選空間,一個或多個數字,一個或多個空格,一個可選的減號,後跟一個或多個數字,可選空間,行尾。匹配regexp的括號化部分的部分作爲data.frame中的列返回。 text = Lines在這個自包含的示例中可以替換爲"myfile.txt",比方說,如果數據來自文件。修改適合的模式。

Lines <- "junk 
junk 
##XYDATA= (X++(Y..Y)) 
131071 -2065 
131070 -4137 
131069 -6408 
131068 -8043" 

library(gsubfn) 
DF <- read.pattern(text = Lines, pattern = "^ *(\\d+) +(-?\\d+) *$") 

,並提供:

> DF 
     V1 V2 
1 131071 -2065 
2 131070 -4137 
3 131069 -6408 
4 131068 -8043 

2)僅使用基礎R讀兩次另一種可能性是簡單地讀取一次它以確定的skip=的值和第二時間使用到執行實際讀那個價值。從文件中讀取myfile.txt"myfile.txt"替換text = LinestextConnection(Lines)

read.table(text = Lines, 
    skip = grep("##XYDATA=", readLines(textConnection(Lines)))) 

新增一些修訂,並加入第二種方法。

+0

謝謝你的回答。你的第二種方法很好地工作! – 2014-09-08 06:31:24

4

這看起來像一個工作爲的fread

library(data.table) 
impcoord <- fread("file.txt",skip="coordinatesXY") 

- 編輯 -

data.table這就是爲什麼它給出一個可重複的例子是很好的。該錯誤意味着您的文件正在造成麻煩。

skip命令將您給它的文本與文件相匹配,以確定要開始的行,因此您需要從行的開頭爲它開始讀取一個唯一的字符串。該函數將工作是這樣的:

## some random text 
## some more random text 
## More random text 
table_heading1, table_heading2, table_heading3 ...etc 
value1, value2, value3 ... etc 
etc 

Just_The_Table <- fread("the_above_as_a_text_file.txt", skip="table_heading1", header=T) 
+0

謝謝你的回答!但是,這種方法在檢測類型時會在第2行返回一個錯誤「ends field 1:## END =',無論我在'skip ='中給出什麼值或提名。 – 2014-09-05 07:56:20

+0

聽起來特定文件,請參閱我的答案中的編輯,瞭解fread跳過如何工作的示例。 – JeremyS 2014-09-05 08:34:23

1

一個可能的辦法是以下幾點:

 conn<-file("file.txt",open="rt") 
    x<-TRUE 
    while (x) 
     {x<-!grepl("coordinatesXY",readLines(conn,n=1))} 
    ret<-read.table(conn,...) #insert additional parameters to read.table 
    close(conn) 

您在輸入文件時讀取一個行且停,當你發現的指標串。然後您通過read.table閱讀該文件。使用這種方法,您不會將整個文件存儲在內存中,而只是存儲您需要的一部分。

+0

謝謝你的回答! – 2014-09-11 06:41:57