string split

Postez ici vos questions, réponses, commentaires ou suggestions - Les sujets seront ultérieurement répartis dans les archives par les modérateurs

Modérateur : Groupe des modérateurs

Pierre-Yves Berrard
Messages : 1029
Enregistré le : 12 Jan 2016, 23:30

string split

Messagepar Pierre-Yves Berrard » 17 Avr 2020, 17:32

Bonjour,

Je cherche à éclater la chaîne de caractères (contenant des guillemets) "1","X","Y,Z" en le vecteur c("1", "X", "Y,Z").

La présence d'une virgule entre Y et Z fait que le trivial

Code : Tout sélectionner

strsplit('"1","X","Y,Z"', ",")
ne donne pas le résultat attendu.
Il faudrait une expression régulière plus sophistiquée qui indique que la virgule sépare seulement si entre deux guillemets.

Notez bien que je suis conscient que c'est un problème d'expressions régulières déguisé en problème R pour pouvoir le poser ici !
PY

Pierre-Yves Berrard
Messages : 1029
Enregistré le : 12 Jan 2016, 23:30

Re: string split

Messagepar Pierre-Yves Berrard » 17 Avr 2020, 20:56

J'ai trouvé cette solution :

Code : Tout sélectionner

stringr::str_match_all('"1","X","Y,Z"', '"([^"]+)"')

Je continue de me demander si c'est possible avec strsplit.
PY

Gabriel Terraz
Messages : 591
Enregistré le : 26 Sep 2011, 15:11

Re: string split

Messagepar Gabriel Terraz » 18 Avr 2020, 21:02

Est-ce que ceci ne répond pas à ta question :

Code : Tout sélectionner

strsplit(character, "(?<=\"),", perl = T)

Pierre-Yves Berrard
Messages : 1029
Enregistré le : 12 Jan 2016, 23:30

Re: string split

Messagepar Pierre-Yves Berrard » 18 Avr 2020, 22:08

Merci Gabriel (je savais que cette technique de lookaround existait, mais je n'ai jamais pris le temps de regarder en détail).

J'ai fait un ajout (\\s*) pour gérer le fait qu'il puisse y avoir un ou plusieurs espaces entourant les virgules séparatrices :

Code : Tout sélectionner

character <- '"1", "X" , "Y,Z"'
strsplit(character, "(?<=\")\\s*,\\s*", perl = TRUE)

Seulement, c'est presque ça, car le vecteur en sortie ne doit plus contenir de guillemets.
Il faudrait si possible intégrer le guillemet au séparateur.
PY

Logez Maxime
Messages : 3138
Enregistré le : 26 Sep 2006, 11:35

Re: string split

Messagepar Logez Maxime » 20 Avr 2020, 07:42

Bonjour,

Une possibilité avec la librairie stringi :

Code : Tout sélectionner

stringi:::stri_extract_all('"1","X","Y,Z"', regex = "(?<=\")([[:alnum:]])(,[[:alnum:]]+)?(?=\")")
A voir s'il faut rajouter de possibles espaces ou si tu les supprimes par la suite avec gsub par exemple.

Cordialement,
Maxime

Gabriel Terraz
Messages : 591
Enregistré le : 26 Sep 2011, 15:11

Re: string split

Messagepar Gabriel Terraz » 20 Avr 2020, 08:55

Pourquoi ne pas tout simplement inclure les guillemets dans le séparateur dans ce cas ?

Code : Tout sélectionner

a <- "\"1\",\"X\",\"Y,Z\""
strsplit(a, "\",\"")
[[1]]
[1] "\"1"   "X"     "Y,Z\""


A noter qu'il te restera à supprimer le guillemet du premier élément de ton vecteur et celui du dernier élément

Ou alors, tu rajoutes comme pattern "guillemet au début" et "guillemet à la fin" comme séparateur

Code : Tout sélectionner

strsplit(a, "\",\"|^\"|\"$")
[[1]]
[1] ""    "1"   "X"   "Y,Z"


Ce qui nécessite de supprimer le premier élément (qui est vide) de ton vecteur.

Pierre-Yves Berrard
Messages : 1029
Enregistré le : 12 Jan 2016, 23:30

Re: string split

Messagepar Pierre-Yves Berrard » 20 Avr 2020, 21:52

Merci à vous deux.
PY


Retourner vers « Questions en cours »

Qui est en ligne

Utilisateurs parcourant ce forum : Google [Bot] et 1 invité