Pages: 1
- Sujet précédent - QGIS: Diviser un champs en 2 selon un caractere specifique - Sujet suivant
#1 Tue 20 February 2024 17:28
- ndlc35
- Participant occasionnel
- Date d'inscription: 17 May 2017
- Messages: 31
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: 114
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: 31
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: 414
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: 31
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: 31
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: 414
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
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 actif
- Date d'inscription: 17 Jul 2018
- Messages: 149
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 actif
- Date d'inscription: 17 Jul 2018
- Messages: 149
Re: QGIS: Diviser un champs en 2 selon un caractere specifique
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: 31
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: 414
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".
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() 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: 414
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
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.
Hors ligne
#13 Wed 21 February 2024 14:27
- ndlc35
- Participant occasionnel
- Date d'inscription: 17 May 2017
- Messages: 31
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: 31
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: 414
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 :
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: 31
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
Pages: 1
- Sujet précédent - QGIS: Diviser un champs en 2 selon un caractere specifique - Sujet suivant