banniere

Le portail francophone de la géomatique


Toujours pas inscrit ? Mot de passe oublié ?
Nom d'utilisateur    Mot de passe              Toujours pas inscrit ?   Mot de passe oublié ?

Annonce

Rencontres QGIS 2025

L'appel à participation est ouvert jusqu'au 19 janvier 2025!

#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: 427

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: 46

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: 46

Re: QGIS 3.22.13: Supprimer des caracteres repetes

Ha... p.jeremie a été plus rapide que moi smile


p.jeremie a écrit:

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: 427

Re: QGIS 3.22.13: Supprimer des caracteres repetes

Nighthawk a écrit:

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)

Nighthawk a écrit:

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

Nighthawk a écrit:

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: 3945

Re: QGIS 3.22.13: Supprimer des caracteres repetes

Bonjour,

p.jeremie a écrit:

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: 427

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

 

Pied de page des forums

Powered by FluxBB