如何计算日期信息之后的空格数



>我有如下所示的非结构化数据:

data <- c("24-March-2017      product 1              color 1",
"March-2017-24              product 2                 color 2",
"2017-24-March  product 3              color 3")

我想计算每行的日期和第一个字符(产品列(之间的空格数。如示例数据所示,日期格式可能会有所不同。此信息将用于将数据转换为结构化格式。

在 R 中执行此操作的最佳方法是什么?我相信gsub可以在这种情况下使用,只是不确定如何申请仅计算每行开头的空格数。

一种方法是使用regexpr返回有关给定正则表达式的第一个匹配项的信息。在您的情况下,您正在寻找重复空格的第一个实例。因此,以下内容将告诉您 (1( 在字符串中的哪个位置可以找到第一个空格,以及 (2( 在属性中有多少个空格:

regexpr("\s+", data)
# [1] 14 14 14
# attr(,"match.length")
# [1]  6 14  2
# attr(,"useBytes")
# [1] TRUE

然后,您可以使用attr提取match.length属性:

attr(regexpr("\s+", data), "match.length")

编辑

正如@xehpuk所指出的,使用 \s+ 将至少匹配一个空格。如果您的日期列包含可能有问题的空格。相反,您需要使用\s{2,} .

您可以分拆该部分,然后获取字符数。

nchar(sub("\S+(\s+).*", "\1", data))
# [1]  6 14  2

或者这个有点有趣:

nchar(data) - nchar(sub("\s+", "", data))
# [1]  6 14  2
使用

与上述gregexpr相同的解决方案,但在一行中:

vapply(gregexpr(" +",dat),function(x)attr(x,"match.length")[1],0)
## [1]  6 14  2

我假设日期总是在开始时到来。

这是获取输出的stringi方法

library(stringi)
m1 <- stri_locate(data, regex = "\s+")
m1[,2] -m1[,1] + 1
#[1]  6 14  2

相关内容

最新更新