Подтвердить что ты не робот

Как подсчитать количество пробелов сразу после даты?

У меня есть неструктурированные данные, которые выглядят так:

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 можно использовать в этом случае, просто не уверен, как применять для подсчета только числа пробелов в начале каждой строки.

4b9b3361

Ответ 1

Одним из подходов было бы использовать 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,}.

Ответ 2

Вы можете вывести этот раздел, а затем взять количество символов.

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

Или это одно удовольствие:

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

Ответ 3

То же решение с использованием gregexpr как указано выше, но в одной строке:

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

Я предполагаю, что дата всегда наступает в начале.

Ответ 4

Вот подход stringi для получения вывода

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