4 votes

remplissage des espaces à l'intérieur/au milieu de la chaîne de caractères jusqu'à un nombre spécifique de caractères

J'ai un vecteur de chaînes de caractères qui doivent avoir chacune 8 caractères alphanumériques. Elles peuvent inclure un ou plusieurs espaces à l'intérieur la chaîne, et non la droite ou la gauche.

Pour les chaînes de moins de 8 caractères, j'aimerais remplir les espaces existants, de sorte qu'au final, toutes les chaînes aient 8 caractères. Les espaces/compléments doivent être conservés à l'intérieur la chaîne. (Contexte : il s'agit des codes postaux du Royaume-Uni)

Mon approche est alambiquée et peut-être imparfaite. Vous trouverez ci-dessous un exemple de vecteur et de résultat souhaité.

## x can take any alphanumeric value
x <- c("xxx xxx", "xx xxx", "x  xxx", "xxx  xxx", "xx   xxx", "xxxxxxxx")

## missing number of spaces
s_miss <- 8 - nchar(x)
## numbers of spaces
s_pres <- stringr::str_count(x, "\\s")

## now here is a convoluted function
## if a space is found, the missing spaces will be added to the already present spaces
padded <- sapply(1: length(x), function(i){
    gsub("\\s+", paste(rep(" ", s_pres[i] + s_miss[i]), collapse = ""), x[i])})

## desired output 
padded
#> [1] "xxx  xxx" "xx   xxx" "x    xxx" "xxx  xxx" "xx   xxx" "xxxxxxxx"
nchar(padded)
#> [1] 8 8 8 8 8 8

3voto

GKi Points 6744

Essayez :

pa <- sapply(x, \(y) sub(" ", strrep(" ", 9 - nchar(y)), y))
pa
#  xxx xxx     xx xxx     x  xxx   xxx  xxx   xx   xxx   xxxxxxxx 
#"xxx  xxx" "xx   xxx" "x    xxx" "xxx  xxx" "xx   xxx" "xxxxxxxx" 

nchar(pa)
# xxx xxx   xx xxx   x  xxx xxx  xxx xx   xxx xxxxxxxx 
#       8        8        8        8        8        8

3voto

Onyambu Points 16644
regmatches(x, regexpr(' ', x)) <- strrep(' ', 9 - nchar(x))
x
[1] "xxx  xxx" "xx   xxx" "x    xxx" "xxx  xxx" "xx   xxx" "xxxxxxxx"

Ou même :

 stringr::str_replace(x, ' ', strrep(' ', 9 - nchar(x)))

3voto

akrun Points 148302

Nous pouvons utiliser sprintf con sub en base R (en utilisant R 4.2.0 )

x1 <- sub("^(\\s+)(\\S+)", "\\2\\1", sprintf('%8s', x))

-sortie

> x1
[1] "xxx  xxx" "xx   xxx" "x    xxx" "xxx  xxx" "xx   xxx" "xxxxxxxx"
> nchar(x1)
[1] 8 8 8 8 8 8

1voto

ThomasIsCoding Points 54213

Voici une autre option de base R (mais qui n'est peut-être pas aussi efficace)

> (s <- sapply(strsplit(x, "\\s+"), function(x) paste0(x, collapse = strrep(" ", 8 - sum(nchar(x))))))
[1] "xxx  xxx" "xx   xxx" "x    xxx" "xxx  xxx" "xx   xxx" "xxxxxxxx"

> nchar(s)
[1] 8 8 8 8 8 8

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X