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é ?

#1 Tue 20 February 2024 17:28

ndlc35
Participant occasionnel
Date d'inscription: 17 May 2017
Messages: 33

QGIS: Diviser un champs en 2 selon un caractere specifique

Bonjour tout le monde,

J'aimerais, scinder un champs en 2 et récupérer dans un autre champs les caractères selon un caractère précis, par exemple :

dans le champs que je veux scinder il y a :

Seg 300 [44FONTbuttA] La Butte → [44FONTmairA] Mairie
Seg 300 [44NANTtaleA] Talensac → [44NANTcirqA] Place du Cirque
Seg 300 [44NANTgoffA] Le Goffic → [44NANTairbA] Bel Air
Seg 301 [44ARTHsicaA] La Sicaudais → [44ROUAegliA] Place de l'Église

...

du coup je voudrais récupérer et mettre dans un autre champs ce qu'il y a entre crochet et après la flèche. Auriez vous une idée de ce qu'il faudrait utiliser dans la calculatrice de champs de QGIS ?

Merci d'avance

Hors ligne

 

#2 Tue 20 February 2024 22:01

Tixi
Participant actif
Date d'inscription: 6 Jun 2022
Messages: 124

Re: QGIS: Diviser un champs en 2 selon un caractere specifique

Essayez avec ca pour avoir le contenu de ce qui est entre crochet après la flèche.

Comme strpos ne donne que la position du premier caractère désiré, ici le [, et qu il y en a 2, je tronque le texte pour commencer après le premier [.


Code:

substr("CHAMP", strpos(substr( "CHAMP",11),'[')+11,11)

Si ce qu il y a entre crochet est de taille variable, il faudra faire des ajustements

Dernière modification par Tixi (Tue 20 February 2024 22:02)

Hors ligne

 

#3 Wed 21 February 2024 09:08

ndlc35
Participant occasionnel
Date d'inscription: 17 May 2017
Messages: 33

Re: QGIS: Diviser un champs en 2 selon un caractere specifique

Bonjour, déjà merci pour votre réponse.

Mais QGIS me met une erreur d'expression : "Impossible de convertir '[' en entier" et attention il y a plus de 2000 entités je ne peux donc pas le faire pour chaque entité malheureusement.

Cordialement

Hors ligne

 

#4 Wed 21 February 2024 13:10

p.jeremie
Participant assidu
Lieu: Valence
Date d'inscription: 10 Sep 2017
Messages: 427

Re: QGIS: Diviser un champs en 2 selon un caractere specifique

Bonjour,

Il semble opportun d'utiliser les expressions rationnelles dans ce cas.
L'expression suivante vous permet de récupérer la première valeur entre crochets :

Code:

array_get(regexp_matches( replace(replace("champ",'[','#'),']','#'),'.*#(.*)#.*#(.*)#.*'),0)

Et celle-ci la deuxième valeur :

Code:

array_get(regexp_matches( replace(replace("champ",'[','#'),']','#'),'.*#(.*)#.*#(.*)#.*'),1)

Je me suis cassé les dents sur l'expression à cause des crochets qui sont utilisés dans les expressions pour regrouper un ensemble de caractères à trouver dans la chaine, du coup je les convertis en # avant avec les deux replace().

L'expression utilisée est donc uniquement :

Code:

'.*#(.*)#.*#(.*)#.*'

Qui correspond à :
.* -> n'importe quel caractère répété 0 à n fois
# -> un caractère # (correspond au [ remplacé via la fonction replace)
(.*) -> groupe de capture ( ) contenant n'importe quel caractère répété 0 à n fois .*
# -> un caractère # (correspond au ] remplacé via la fonction replace)
.* -> n'importe quel caractère répété 0 à n fois
# -> un caractère # (correspond au [ remplacé via la fonction replace)
(.*) -> groupe de capture ( ) contenant n'importe quel caractère répété 0 à n fois .*
# -> un caractère # (correspond au ] remplacé via la fonction replace)
.* -> n'importe quel caractère répété 0 à n fois

L'expression est appelée avec la fonction regexp_matches() qui renvoie une liste de résultat, en l'occurrence les deux valeurs entre crochets (qui correspondent aux deux groupes de capture entre parenthèses).

La fonction array_get() permet de récupérer la première (0) ou la deuxième (1) valeur.

En espérant que ce soit clair pour vous.

Pour plus d'infos sur les regex (expressions rationnelles), voir le site https://regex101.com/ par exemple
Voici un de vos exemples avec l'expression que je propose : https://regex101.com/r/2m5x2Y/1


Edit : suite au commentaire de Benoit plus bas dans ce post, les versions simplifiées des expressions, sans besoin de remplacer les crochets :

Code:

array_get(regexp_matches("champ",'.*\\[(.*)\\].*\\[(.*)\\].*'),0)

Code:

array_get(regexp_matches("champ",'.*\\[(.*)\\].*\\[(.*)\\].*'),1)

Dernière modification par p.jeremie (Wed 21 February 2024 14:20)

Hors ligne

 

#5 Wed 21 February 2024 13:16

ndlc35
Participant occasionnel
Date d'inscription: 17 May 2017
Messages: 33

Re: QGIS: Diviser un champs en 2 selon un caractere specifique

Bonjour merci pour votre aide, ducoup j'ai juste a utiliser une des deux ligne de code que vous avez mis au début ?

Hors ligne

 

#6 Wed 21 February 2024 13:22

ndlc35
Participant occasionnel
Date d'inscription: 17 May 2017
Messages: 33

Re: QGIS: Diviser un champs en 2 selon un caractere specifique

Ducoup j'ai utilisé votre ligne de code qui fonctionne mais qui récupère ce qu'il y a entre crochet mais avant la flèche qui est au milieu. Or moi je voudrai récupérer ce qu'il y a entre crochet APRES la flèche.

Avez vous une idée comment récupérer ces caractères ?

Hors ligne

 

#7 Wed 21 February 2024 13:23

p.jeremie
Participant assidu
Lieu: Valence
Date d'inscription: 10 Sep 2017
Messages: 427

Re: QGIS: Diviser un champs en 2 selon un caractere specifique

C'est mieux de réussir à comprendre comment c'est construit, pour pouvoir le refaire pour un autre cas d'usage wink

Si vous voulez la deuxième expression entre crochets, il faut utiliser la deuxième expression.

Dernière modification par p.jeremie (Wed 21 February 2024 13:24)

Hors ligne

 

#8 Wed 21 February 2024 13:49

Benoit D
Participant assidu
Date d'inscription: 17 Jul 2018
Messages: 151

Re: QGIS: Diviser un champs en 2 selon un caractere specifique

Contenu du premier crochet    : regexp_substr(  "champ" , '^[^\\[]*\\[(\\w*)\\]')
Contenu du deuxième crochet : regexp_substr(  "champ" , '→ [^\\[]*\\[(\\w*)\\]')

Hors ligne

 

#9 Wed 21 February 2024 13:53

Benoit D
Participant assidu
Date d'inscription: 17 Jul 2018
Messages: 151

Re: QGIS: Diviser un champs en 2 selon un caractere specifique

p.jeremie a écrit:

Je me suis cassé les dents sur l'expression à cause des crochets qui sont utilisés dans les expressions pour regrouper un ensemble de caractères à trouver dans la chaine, du coup je les convertis en # avant avec les deux replace().


Effectivement ça complique les choses il faut les échapper avec \\ ce qui rend moins lisible le pattern mais évite les "replace".

Hors ligne

 

#10 Wed 21 February 2024 14:03

ndlc35
Participant occasionnel
Date d'inscription: 17 May 2017
Messages: 33

Re: QGIS: Diviser un champs en 2 selon un caractere specifique

Malheureusement dans les deux idées de solution cela récupère toujours le contenu du premier crochet

Hors ligne

 

#11 Wed 21 February 2024 14:11

p.jeremie
Participant assidu
Lieu: Valence
Date d'inscription: 10 Sep 2017
Messages: 427

Re: QGIS: Diviser un champs en 2 selon un caractere specifique

Benoit D a écrit:
p.jeremie a écrit:

Je me suis cassé les dents sur l'expression à cause des crochets qui sont utilisés dans les expressions pour regrouper un ensemble de caractères à trouver dans la chaine, du coup je les convertis en # avant avec les deux replace().


Effectivement ça complique les choses il faut les échapper avec \\ ce qui rend moins lisible le pattern mais évite les "replace".


Merci Benoit, j'avais échappé avec un seul \ comme c'est de coutume pour les regex. C'est étonnant qu'on doive en mettre deux dans QGIS, qui utilise pourtant le moteur d'expression perl il me semble...
Edit : en fait c'est précisé dans l'aide de la fonction regex_match() mais pas dans celle de regexp_matches() smile sans préciser pourquoi.

Dernière modification par p.jeremie (Wed 21 February 2024 14:22)

Hors ligne

 

#12 Wed 21 February 2024 14:17

p.jeremie
Participant assidu
Lieu: Valence
Date d'inscription: 10 Sep 2017
Messages: 427

Re: QGIS: Diviser un champs en 2 selon un caractere specifique

ndlc35 a écrit:

Malheureusement dans les deux idées de solution cela récupère toujours le contenu du premier crochet


Alors il doit y avoir quelque chose que vous ne nous avez pas bien précisé, car ça fonctionne pour moi dans QGIS.
J'ai un champ "champ" dans lequel j'ai mis vos valeurs.
Puis j'ai créé deux champs Valeur1 et Valeur2 qui récupèrent bien les valeurs entre crochets.


Fichier(s) joint(s) :
Pour accéder aux fichiers vous devez vous inscrire.

Hors ligne

 

#13 Wed 21 February 2024 14:27

ndlc35
Participant occasionnel
Date d'inscription: 17 May 2017
Messages: 33

Re: QGIS: Diviser un champs en 2 selon un caractere specifique

Dans la copie d'écran que vous avez joint, dans le commentaire il y a toute la ligne de code ?

Hors ligne

 

#14 Wed 21 February 2024 14:32

ndlc35
Participant occasionnel
Date d'inscription: 17 May 2017
Messages: 33

Re: QGIS: Diviser un champs en 2 selon un caractere specifique

J'ai rien dis ne me demander pas pourquoi mais en relançant la ligne de code ça a marché.

J'aurais une dernière question comment rajouter les crochet au début et a la fin du contenu de chaque entité nouvellement créée ?

Hors ligne

 

#15 Wed 21 February 2024 14:48

p.jeremie
Participant assidu
Lieu: Valence
Date d'inscription: 10 Sep 2017
Messages: 427

Re: QGIS: Diviser un champs en 2 selon un caractere specifique

Vous avez possibilité d'éditer vos messages, essayez d'utiliser cette fonction plutôt que de poster deux messages à la suite à 5 minutes d'intervalle.

Concernant votre question :

ndlc35 a écrit:

J'aurais une dernière question comment rajouter les crochet au début et a la fin du contenu de chaque entité nouvellement créée ?


Vous ne créez pas de nouvelle entité si j'ai bien compris, mais seulement un nouveau champ ?
Votre demande initiale était de pouvoir récupérer ce qui est entre les crochets, donc les solutions proposées n'incluent pas les crochets.
J'insiste sur le fait que vous compreniez l'expression proposée plutôt que de la recopier "bêtement". Ca vous servira à pouvoir adapter l'expression à vos besoins. Dans le cas qui nous intéresse, il suffit d'intégrer les crochets dans le groupe de capture (les parenthèses). Pour récupérer la deuxième valeur entre crochets, crochets inclus :

Code:

array_get(regexp_matches("champ",'.*(\\[.*\\]).*(\\[.*\\]).*'),1)

Hors ligne

 

#16 Wed 21 February 2024 15:33

ndlc35
Participant occasionnel
Date d'inscription: 17 May 2017
Messages: 33

Re: QGIS: Diviser un champs en 2 selon un caractere specifique

Très bien je vous remercie à tout les deux cela à marché j'ai pu récupérer ducoup le contenu des crochets après la flèche.

Un grand merci à vous

Hors ligne

 

Pied de page des forums

Powered by FluxBB