#1 Tue 28 February 2023 12:42
- Nighthawk
- Participant actif
- Date d'inscription: 17 Sep 2014
- Messages: 129
QGIS 3.22.13: Supprimer des caracteres repetes
Bonjour,
Pour le contexte : une concaténation m'a rendu un résultat de ce type :
Code:
, , , Résidences secondaires, , , Logement social,
J'aimerais donc savoir s'il existe un moyen sous QGIS de :
1. retirer toutes les virgules situées à gauche de ma chaine de caractères (un lpad inversé en somme),
2. retirer toutes les virgules situées à droite (un rpad inversé),
3. remplacer mes suites de virgules au milieu de la chaine pour avoir une virgule simple (un replace).
Le souci c'est que le nombre de virgules peut varier pour les 3 points évoqués ci-dessus. Le résultat escompté serait donc celui-ci :
Code:
Résidences secondaires, Logement social
Sinon en passant par une autre méthode ?
A noter que je souhaite intégrer cette expression dans un module développé sur la base du modeleur graphique, donc une fonction SQL peut également fonctionner si c'est plus simple ?
D'avance merci pour vos idées.
Hors ligne
#2 Tue 28 February 2023 13:42
- p.jeremie
- Participant assidu
- Lieu: Valence
- Date d'inscription: 10 Sep 2017
- Messages: 412
Re: QGIS 3.22.13: Supprimer des caracteres repetes
Bonjour,
L'expression suivante devrai répondre à votre besoin :
Code:
regexp_replace( regexp_replace( regexp_replace("champ" ,'^(, )+',''), '(, )+', ', '), ',$', '' )
Il s'agit de 3 substitutions avec des expression rationnelles.
La première remplace les ", " présents une ou plusieurs fois au début de la chaîne par une chaîne vide.
La deuxième remplace les ", " répétés par un seul ", "
La troisième remplace une virgule en fin de chaîne par une chaîne vide
Hors ligne
#3 Tue 28 February 2023 14:04
- arginet
- Participant occasionnel
- Lieu: Lyon
- Date d'inscription: 23 Feb 2017
- Messages: 43
Re: QGIS 3.22.13: Supprimer des caracteres repetes
Bonjour,
Voici deux pistes de réponse.
Avec regex :
Code:
regexp_replace( regexp_replace( regexp_replace( ', , , Résidences secondaires, , , Logement social, ', '(, )+', ', '), ',$', ''), '^,', '')
En utilisant les fonctions array :
Code:
array_to_string( array_remove_all( string_to_array( ', , , Résidences secondaires, , , Logement social, ', ', '), ''), ', ')
Mais peut-être avez vous la possibilité de récupérer votre liste initiale directement sous forme d'un array, ce qui simplifierait sa manipulation...
Hors ligne
#4 Tue 28 February 2023 14:09
- arginet
- Participant occasionnel
- Lieu: Lyon
- Date d'inscription: 23 Feb 2017
- Messages: 43
Re: QGIS 3.22.13: Supprimer des caracteres repetes
Ha... p.jeremie a été plus rapide que moi
Bonjour,
L'expression suivante devrai répondre à votre besoin :Code:
regexp_replace( regexp_replace( regexp_replace("champ" ,'^(, )+',''), '(, )+', ', '), ',$', '' )Il s'agit de 3 substitutions avec des expression rationnelles.
La première remplace les ", " présents une ou plusieurs fois au début de la chaîne par une chaîne vide.
La deuxième remplace les ", " répétés par un seul ", "
La troisième remplace une virgule en fin de chaîne par une chaîne vide
Hors ligne
#5 Tue 28 February 2023 15:01
- Nighthawk
- Participant actif
- Date d'inscription: 17 Sep 2014
- Messages: 129
Re: QGIS 3.22.13: Supprimer des caracteres repetes
Bonjour à tous les deux,
Excellent, c'est exactement ce que je cherchais !!! En plus je pense que je vais pouvoir le réutiliser dans d'autres cas de figure (je vais virer les 0 en trop dans mes numéros de parcelles) !!!
Si je comprend bien (parce que je ne suis pas très familiarisé avec les regex) :
le '^(, )+' signifie que l'on est au début de la chaine de caractères (ce serait le "^" ?) et qu'il peut y avoir un nombre inconnu de ", " répétés (ce serait le "+" ?)
Du coup on retrouverais le nombre inconnu de répétitions en milieu de chaîne (toujours avec le "+")
Et en fin de chaîne c'est un peu plus complexe pour moi : le "$" signifierais à la fois qu'on est en fin de chaine et qu'on a ", " répété un nombre inconnu de fois ?
Pour compléter, en réponse à arginet, je pourrais en effet récupérer les valeurs sous forme d'array, mais je ne connais pas non plus très bien les array. La solution serait si simple que ça ?
En tous cas merci pour votre aide, j'ai la réponse à ma question.
Hors ligne
#6 Tue 28 February 2023 20:22
- p.jeremie
- Participant assidu
- Lieu: Valence
- Date d'inscription: 10 Sep 2017
- Messages: 412
Re: QGIS 3.22.13: Supprimer des caracteres repetes
Si je comprend bien (parce que je ne suis pas très familiarisé avec les regex) :
le '^(, )+' signifie que l'on est au début de la chaine de caractères (ce serait le "^" ?) et qu'il peut y avoir un nombre inconnu de ", " répétés (ce serait le "+" ?)
C'est ça :
^ pour début de chaîne/ligne
(, ) : parenthèses pour grouper la chaîne composée de la virgule suivie de l'espace
+ pour indiquer que ce groupe est présent de 1 à n fois (donc au moins une fois)
Du coup on retrouverais le nombre inconnu de répétitions en milieu de chaîne (toujours avec le "+")
oui, la deuxième étape est le remplacement du groupe (, ) présent entre 1 et n fois (le +) par une seule occurrence virgule espace
Et en fin de chaîne c'est un peu plus complexe pour moi : le "$" signifierais à la fois qu'on est en fin de chaine et qu'on a ", " répété un nombre inconnu de fois ?
Le dollar signifie bien la fin de chaîne/ligne.
Donc là on remplace une virgule placée en fin de ligne par une chaîne vide.
Attention, si tu as encore une espace après la dernière virgule il faut la mettre dans la chaîne à remplacer :
Code:
regexp_replace( regexp_replace( regexp_replace("champ" ,'^(, )+',''), '(, )+', ', '), ',$ ', '' )
Hors ligne
#7 Wed 01 March 2023 10:05
- SANTANNA
- Moderateur
- Lieu: Angers
- Date d'inscription: 18 Jan 2008
- Messages: 3883
Re: QGIS 3.22.13: Supprimer des caracteres repetes
Bonjour,
Code:
',$ ',
Si $ est la fin de ligne, il ne devrait y avoir rien d'autre à espérer après, non?
Peut-être plutôt
Code:
', *$',
/moi pas expert en regex, je préviens. pas tapé.
Hors ligne
#8 Wed 01 March 2023 11:43
- p.jeremie
- Participant assidu
- Lieu: Valence
- Date d'inscription: 10 Sep 2017
- Messages: 412
Re: QGIS 3.22.13: Supprimer des caracteres repetes
En effet j'ai fait une faute dans mon précédent message. Le dollar doit bien être à la fin de la chaîne.
Code:
regexp_replace( regexp_replace( regexp_replace("champ" ,'^(, )+',''), '(, )+', ', '), ', $', '' )
Ton exemple
Code:
', *$',
correspond à "une virgule, suivi du caractère espace présent 0 à n fois (*) en suivi de la fin de chaîne ($)"
Edit: il existe des sites qui aident à comprendre et construire les expressions rationnelles, par exemple https://regex101.com/
Dernière modification par p.jeremie (Wed 01 March 2023 11:44)
Hors ligne