2012-09-02 74 views
6

我正在使用readLines以文本格式讀取數據文件。第一個'列'是我不需要的複雜文本。下一列包含我確實需要的數據。第一個'列'和數據由冒號(:)分隔。我希望在第一個冒號分割每一行並刪除結果文本字符串,只保留數據。在第一個冒號處分割字符串

下面是一個示例數據文件。一個潛在的複雜情況是一行數據包含多個冒號。這條線可能在某個時候成爲我的頭。所以,我可能不應該在每個結腸,就在第一個結腸分裂。

my.data <- "first string of text..: aa : bb : cc 
      next string ........ : 2 0 2 
      third string......1990: 7 6 5 
      last string   : 4 2 3" 

my.data2 <- readLines(textConnection(my.data)) 
my.data2 

我試圖在這裏提出代碼:

Split on first comma in string

這裏:以上在第一個鏈接

R: removing the last three dots from a string

代碼似乎只在第一個冒號分割第一行。第二個鏈接中的代碼可能會做我想做的,但對於我來說太複雜了,無法對其進行成功修改。

下面是我希望得到的數據,在這一點上,我可以用一個很簡單的gsub語句簡單替換第一行空的空間在剩餘的冒號:

aa : bb : cc 
    2 0 2 
    7 6 5 
    4 2 3 

很抱歉,如果這是一個重複我沒有找到我的帖子,並感謝您的任何建議或協助。

回答

15

下面將開始在字符串的開頭,然後抓住一切直到幷包括第一個冒號和任何額外的空間和替換什麼也沒有(基本上只是刪除它)

gsub("^[^:]+:\\s*", "", my.data2) 

如果你不「不想把空格去掉,你可以做

gsub("^[^:]+:", "", my.data2) 

對於一些澄清一下原來的正則表達式做。在起步之初:

^這個說要在字符串的開頭只能找到匹配

[^:]這代表這不是一個冒號

+這說的前面的字符匹配一個或任意字符更多次(所以匹配許多非冒號越好)

:這是實際結腸匹配

\\s此相匹配的空間

*這說的前面的字符零次或多次(所以我們去掉冒號後的任何額外的空間)

匹配所以把他們放在一起,我們開始在字符串的開頭然後匹配儘可能多的非冒號字符,然後抓住第一個冒號字符和任何額外的空格,並將其全部替換爲無(基本上刪除我們不想要的所有垃圾)。

+0

謝謝你的回答和傑出的解釋。 –

+5

+1的解釋 –