【发布时间】:2015-08-27 22:21:13
【问题描述】:
我有一个很大的字符串列表,列表中的每个项目都显示如下:
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个值:
[5] "\t\t\t85,Thursday,08/25/2014,05:17PM,Data Transfer,KB,\"78,088 KB\",MSDG,AT,GPRR,,0.00"
据我了解,这确实针对我要更改的部分的开始和结束。但我觉得有一种更好的方法来操作字符串,我似乎无法弄清楚它的正则表达式。有人对此有更优雅的解决方案吗?
【问题讨论】:
-
或许:
lapply(largeList,strsplit,split="(?<![0-9]),(?![0-9])",perl=T) -
试试
gsub(".*?\"([^\"]+).*", "\\1", largeList)。 -
你到底想要什么?它只是传输/文件的大小(即 KB 之前的数字?还是忽略数字中的逗号的字符串拆分?
-
顺便说一句,欢迎来到 SO,这是一个不错的开始。
-
也许使用 find 而不是 split(如果 R 支持这些结构)
(?:(?:^|,|\r?\n)\s*)(?:"([^"\\]*(?:\\[\S\s][^"\\]*)*)"(?:\s*(?:(?=,|\r?\n)|$))|([^,]*)(?:\s*(?:(?=,)|$)))