拆分字符串中的第一个逗号

Posted

技术标签:

【中文标题】拆分字符串中的第一个逗号【英文标题】:Split on first comma in string 【发布时间】:2012-04-25 03:51:03 【问题描述】:

如何使用 base 有效地将以下字符串拆分为第一个逗号?

x <- "I want to split here, though I don't want to split elsewhere, even here."
strsplit(x, ???)

期望的结果(2 个字符串):

[[1]]
[1] "I want to split here"   "though I don't want to split elsewhere, even here."

提前谢谢你。

编辑:没想到要提这个。这需要能够泛化到一列,这样的字符串向量,如:

y <- c("Here's comma 1, and 2, see?", "Here's 2nd sting, like it, not a lot.")

结果可以是两列或一个长向量(我可以获取其他所有元素)或每个索引 ([[n]]) 有两个字符串的字符串列表。

对不够清晰表示歉意。

【问题讨论】:

非常hacky,但是像list(head(y[[1]],1), paste(tail(y[[1]],-1), collapse = ",")) 这样ystrsplit(x, ...) 的输出呢? Chase 我试过了,但似乎无法让它适用于类似字符串的向量。我编辑了我的原始帖子以进一步解释问题。 str_locate_all(string=y, ',') 将找到您的模式的所有索引位置(在您的情况下为逗号),然后可以将其应用于从向量或列中进行选择。 【参考方案1】:

这就是我可能会做的事情。它可能看起来很 hacky,但由于 sub()strsplit() 都是矢量化的,因此在处理多个字符串时它也可以顺利工作。

XX <- "SoMeThInGrIdIcUlOuS"
strsplit(sub(",\\s*", XX, x), XX)
# [[1]]
# [1] "I want to split here"                               
# [2] "though I don't want to split elsewhere, even here."

【讨论】:

@josh-obrien 您将如何扩展该代码以修剪 [2] 中的前导空格。 我会用gsub("^\\s+|\\s+$", "", JOSH's STUFF)包装它 我喜欢乔希。它可以工作并且非常简单并且保持在基础上。谢谢你。 +1 您可以使用any(grepl(XX,x)) 检查您的XX 是否正常。如果是FALSE 就可以了。 @established1969 -- 要修剪逗号后面的空格,我会改为使用strsplit(sub(",\\s*", XX, x), XX)【参考方案2】:

来自stringr 包:

str_split_fixed(x, pattern = ', ', n = 2)
#      [,1]                  
# [1,] "I want to split here"
#      [,2]                                                
# [1,] "though I don't want to split elsewhere, even here."

(这是一个一行两列的矩阵。)

【讨论】:

【参考方案3】:

这是另一种解决方案,使用正则表达式来捕获第一个逗号之前和之后的内容。

x <- "I want to split here, though I don't want to split elsewhere, even here."
library(stringr)
str_match(x, "^(.*?),\\s*(.*)")[,-1] 
# [1] "I want to split here"                              
# [2] "though I don't want to split elsewhere, even here."

【讨论】:

【参考方案4】:

library(stringr)

str_sub(x,end = min(str_locate(string=x, ',')-1))

这将得到你想要的第一个位。更改str_sub 中的start=end= 以获得您想要的任何其他内容。

如:

str_sub(x,start = min(str_locate(string=x, ',')+1 ))

并用str_trim 换行以去掉前导空格:

str_trim(str_sub(x,start = min(str_locate(string=x, ',')+1 )))

【讨论】:

【参考方案5】:

这可行,但我更喜欢 Josh Obrien:

y <- strsplit(x, ",")
sapply(y, function(x) data.frame(x= x[1], 
    z=paste(x[-1], collapse=",")), simplify=F))

受到追逐的回应的启发。

许多人给出了非基本方法,所以我想我会添加我通常使用的方法(尽管在这种情况下我需要一个基本响应):

y <- c("Here's comma 1, and 2, see?", "Here's 2nd sting, like it, not a lot.")
library(reshape2)
colsplit(y, ",", c("x","z"))

【讨论】:

在您的第一部分中,我不明白为什么您会在 seq_along(y) 上使用 sapply 而不仅仅是 y。您看起来并不真正需要明确的索引。即使您希望将它们保留在其他字符串中,您似乎也删除了所有逗号?

以上是关于拆分字符串中的第一个逗号的主要内容,如果未能解决你的问题,请参考以下文章

SQL拆分逗号分隔的字符串

如何在第一个逗号后拆分第一个竖线上的字符串?

在逗号上拆分字符串并忽略双引号中的逗号[重复]

Java:拆分逗号分隔的字符串但忽略引号中的逗号

如何根据一个字段是不是包含oracle sql中的逗号分隔字符串将单行拆分为多行?

使用拆分字符串自定义共享按钮中的意图或如何拆分字符串并替换奇数逗号