2015-08-27 141 views
3

我有一個字符串的大名單的大名單中刪除逗號在名單上的每個項目這樣表示:檢測和從字符串只有部分字符串(R)

largeList<- 
    c("\t\t\t73,Tuesday,08/23/2014,09:03PM,Data Transfer,KB,\"60 KB\",MSDG,AT,GPRR,,0.00", 
    "\t\t\t74,Tuesday,08/23/2014,10:17PM,Data Transfer,KB,\"1,412 KB\",MSDG,AT,GPRR,,0.00",  
    "\t\t\t75,Wednesday,08/24/2014,12:08AM,Data Transfer,KB,\"2,589 KB\",MSDG,AT,GPRR,,0.00",   
    "\t\t\t76,Wednesday,08/24/2014,12:26PM,Data Transfer,KB,\"23,576 KB\",MSDG,AT,GPRR,,0.00", 
    "\t\t\t85,Thursday,08/25/2014,05:17PM,Data Transfer,KB,\"78,088 KB\",MSDG,AT,GPRR,,0.00") 

我想使用

lapply(largeList, "strsplit",",") 

但我對面來的問題是,雖然大部分的值都小於1000(如「\」 60 KB \「),也有大的值已逗號用逗號分割的數據在他們每隔一段時間(如「23,576 KB \」)。我試過

grep('(["KB"])', test, value=TRUE) 

嘗試找到那種模式,但所有這一切發生的是整個字符串被返回。我知道最終我會用gsub()來替換那個部分,但是我對這個模式應該是什麼感到不知所措。最好部分解決方案,我能夠想出使用stringr包:

str_locate_all(test, '([""])') 

[[1]] 
    start end 
[1,] 52 52 
[2,] 62 62 

以上示例列表的第五值返回:

 [5] "\t\t\t85,Thursday,08/25/2014,05:17PM,Data Transfer,KB,\"78,088 KB\",MSDG,AT,GPRR,,0.00" 

據我所知,這確實是針對我想改變的部分的開始和結束。但我覺得有更好的方法來操縱字符串,我似乎無法弄清楚它的正則表達式。任何人都有一個更優雅的解決方案呢?

+0

也許:'lapply(largeList,strsplit,分裂= 「?!?!(<[0-9]),([0-9])」,PERL = T)' – MichaelChirico

+1

嘗試'gsub(「。*?\」([^ \「] +)。*」,「\\ 1」,largeList)'。 –

+0

你究竟想要什麼?它只是傳輸/文件的大小(例如,KB之前的數字?還是它忽略了數字中逗號的字符串的分割? – MichaelChirico

回答

7

也許可以救自己的頭撞正則表達式的一個下午,並考慮read.csv()。由於您正在查找的KB值被數據中的引號包圍,並且您希望無論如何都將其餘數據分割爲逗號,因此這看起來是不錯的選擇。在下面的通知欄V7

read.csv(text = largeList, header = FALSE, stringsAsFactors = FALSE) 
# V1  V2   V3  V4   V5 V6  V7 V8 V9 V10 V11 V12 
# 1 73 Tuesday 08/23/2014 09:03PM Data Transfer KB  60 KB MSDG AT GPRR NA 0 
# 2 74 Tuesday 08/23/2014 10:17PM Data Transfer KB 1,412 KB MSDG AT GPRR NA 0 
# 3 75 Wednesday 08/24/2014 12:08AM Data Transfer KB 2,589 KB MSDG AT GPRR NA 0 
# 4 76 Wednesday 08/24/2014 12:26PM Data Transfer KB 23,576 KB MSDG AT GPRR NA 0 
# 5 85 Thursday 08/25/2014 05:17PM Data Transfer KB 78,088 KB MSDG AT GPRR NA 0 

爲了提供只有KB值,您可以使用

read.csv(text = largeList, header = FALSE, stringsAsFactors = FALSE)[[7]] 
# [1] "60 KB"  "1,412 KB" "2,589 KB" "23,576 KB" "78,088 KB" 

此外,如果您需要保留像分割數據0.00\t確切的文字,你可以添加參數colClasses = "character"和刪除stringsAsFactors = FALSE。這樣數據看起來就像它一樣,只是在相關的逗號分割。

read.csv(text = largeList, header = FALSE, colClasses = "character") 
#   V1  V2   V3  V4   V5 V6  V7 V8 V9 V10 V11 V12 
# 1 \t\t\t73 Tuesday 08/23/2014 09:03PM Data Transfer KB  60 KB MSDG AT GPRR  0.00 
# 2 \t\t\t74 Tuesday 08/23/2014 10:17PM Data Transfer KB 1,412 KB MSDG AT GPRR  0.00 
# 3 \t\t\t75 Wednesday 08/24/2014 12:08AM Data Transfer KB 2,589 KB MSDG AT GPRR  0.00 
# 4 \t\t\t76 Wednesday 08/24/2014 12:26PM Data Transfer KB 23,576 KB MSDG AT GPRR  0.00 
# 5 \t\t\t85 Thursday 08/25/2014 05:17PM Data Transfer KB 78,088 KB MSDG AT GPRR  0.00 
read.csv(text = largeList, header = FALSE, colClasses = "character")[[7]] 
# [1] "60 KB"  "1,412 KB" "2,589 KB" "23,576 KB" "78,088 KB" 
+2

問題的重定向很好解決它 – thelatemail

+1

哇這實際上正是我所需要的,謝謝! – Tai0827

+0

@ Tai0827 - 我覺得它很接近,恩,很樂意幫忙。 –

1

要獲取所有值雙引號內,使用

gsub("^[^\"]*\"([^\"]+).*", "\\1", largeList) 

模式比"其他0個或更多字符的字符串開始到第一"相匹配,然後捕獲雙裏面的內容引號,並匹配其餘的內容。然後捕獲的文本將取代整個比賽。

IDEONE demo

0
Try: 
gsub('.*\"(.*)\".*','\\1',largeList) 
[1] "60 KB"  "1,412 KB" "2,589 KB" "23,576 KB" "78,088 KB"