Разделить строку каждые 5 символов

Предположим, что у меня длинная строка:

"XOVEWVJIEWNIGOIWENVOIWEWVWEW"

Как мне разделить это, чтобы получить каждые 5 символов, а затем пробел?

"XOVEW VJIEW NIGOI WENVO IWEWV WEW"

Обратите внимание, что последняя короче.

Я могу сделать цикл, где я постоянно рассчитываю и строю новый строковый символ по символу, но, конечно же, должно быть что-то лучше нет?

Ответы

Ответ 1

Использование регулярных выражений:

gsub("(.{5})", "\\1 ", "XOVEWVJIEWNIGOIWENVOIWEWVWEW")
# [1] "XOVEW VJIEW NIGOI WENVO IWEWV WEW"

Ответ 2

Используя sapply

> string <- "XOVEWVJIEWNIGOIWENVOIWEWVWEW"
> sapply(seq(from=1, to=nchar(string), by=5), function(i) substr(string, i, i+4))
[1] "XOVEW" "VJIEW" "NIGOI" "WENVO" "IWEWV" "WEW"  

Ответ 3

Вы можете попробовать что-то вроде следующего:

s <- "XOVEWVJIEWNIGOIWENVOIWEWVWEW" # Original string
l <- seq(from=5, to=nchar(s), by=5) # Calculate the location where to chop

# Add sentinels 0 (beginning of string) and nchar(s) (end of string)
# and take substrings. (Thanks to @flodel for the condense expression)
mapply(substr, list(s), c(0, l) + 1, c(l, nchar(s))) 

Вывод:

[1] "XOVEW" "VJIEW" "NIGOI" "WENVO" "IWEWV" "WEW"

Теперь вы можете paste результирующий вектор (с collapse=' ') получить одну строку с пробелами.

Ответ 4

Вы также можете использовать подстроку без цикла. substring является векторизованным substr

x <- "XOVEWVJIEWNIGOIWENVOIWEWVWEW"
n <- seq(1, nc <- nchar(x), by = 5) 
paste(substring(x, n, c(n[-1]-1, nc)), collapse = " ")
# [1] "XOVEW VJIEW NIGOI WENVO IWEWV WEW"

Ответ 5

Нет * примените решение stringi:

x <- "XOVEWVJIEWNIGOIWENVOIWEWVWEW"
stri_sub(x, seq(1, stri_length(x),by=5), length=5)
[1] "XOVEW" "VJIEW" "NIGOI" "WENVO" "IWEWV" "WEW" 

Это извлекает подстроки так же, как в ответе @Jilber, но функция stri_sub векторизована, поэтому нам не нужно использовать * apply here.