Split a string every 5 characters

12,373

Solution 1

Using regular expressions:

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

Solution 2

Using 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"  

Solution 3

You can try something like the following:

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))) 

Output:

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

Now you can paste the resulting vector (with collapse=' ') to obtain a single string with spaces.

Solution 4

No *apply stringi solution:

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

This extracts substrings just like in @Jilber answer, but stri_sub function is vectorized se we don't need to use *apply here.

Solution 5

You can also use a sub-string without a loop. substring is the vectorized 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"
Share:
12,373
user1357015
Author by

user1357015

Updated on June 02, 2022

Comments

  • user1357015
    user1357015 almost 2 years

    Suppose I have a long string:

    "XOVEWVJIEWNIGOIWENVOIWEWVWEW"
    

    How do I split this to get every 5 characters followed by a space?

    "XOVEW VJIEW NIGOI WENVO IWEWV WEW"
    

    Note that the last one is shorter.

    I can do a loop where I constantly count and build a new string character by character but surely there must be something better no?

  • rawr
    rawr over 9 years
    should be pasted and collapsed methinks
  • user1357015
    user1357015 over 9 years
    This looks great, I can paste and collapse from here. But would you mind giving some insight onto how that mapply works? Thanks!
  • musically_ut
    musically_ut over 9 years
    @user1357015 Added some comments.
  • user1357015
    user1357015 over 9 years
    @flodel, can you help explain "\\1 "? I've figured everything else out but that stumbles me
  • Tyler Rinker
    Tyler Rinker over 9 years
    @user1357015 I think hwnd does a nice job explaining this idea here: stackoverflow.com/a/26495062/1000343
  • Brian D
    Brian D almost 6 years
    this is awesome, and super fast :)
  • Lasarus9
    Lasarus9 almost 5 years
    What would be the way to reverse this? For example, how would you do this starting from the right, and going to left? Also, instead of splitting by 5, lets say i want the first 8 characters and the last 6 characters separated, so it would look like: ` "XOVEWVJI EWNIGOIWENVOIW EWVWEW" `