2015-08-27 104 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"