Nous utilisons des cookies pour vous garantir la meilleure expérience sur notre site. Si vous continuez à utiliser ce dernier, nous considèrerons que vous acceptez l'utilisation des cookies. J'ai compris ! ou En savoir plus !.
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 Mon 07 August 2023 15:40

bastiencarto
Participant occasionnel
Date d'inscription: 5 Nov 2020
Messages: 11

QGIS: selectionner valeur dans un champ par une suite de lettres ?

Bonjour à tous,
Je cherche à créer une nouvelle colonne code postale en fonction d'un champ commune.
Seulement je veux extraire un maximum de données en évitant la casse.
Jusqu'à présent j'utilise les conditions regexp_match et CASE, cela donne:

CASE WHEN
regexp_match("adresse",'MANOSQUE')
THEN
'04100'

Cela permet si le champ adresse se compose comme suit : 'l'hypermarché à MANOSQUE rue droite' de m'extraire 'MANOQUE' et donc le code postale.
Seulement j'ai peur de passer à coté de beaucoup de données qui ne pourront être identifiées à cause des fautes d'orthographe.

Je voulais savoir si il y a une fonction ou une méthode qui ressemble à regexp_match et qui permet d'identifier le nombre de lettre qui doivent se suivre dans le champ ?

ex:
regexp_matchV2("adresse",'MANOSQUE',4) serait vrai si un champ contient  plus de 4 lettres qui se suivent dans l'ordre de la valeur.

MANOHSKE -->4--> MANOhke-->vrai
MAINHOSQUE  --> 4-->mainhOSQUE-->vrai (supérieur à 4)
MANOKSQUE --> 4-->MANOksque et manokSQUE -->vrai
MANIQANO--> faux car MAN ou ANO est inférieur à 4 lettres qui se suivent.

Je vous remercie par avance, Bastien

Hors ligne

 

#2 Mon 07 August 2023 17:27

Robin B
Participant occasionnel
Lieu: Montpellier
Date d'inscription: 31 Jul 2023
Messages: 14

Re: QGIS: selectionner valeur dans un champ par une suite de lettres ?

Bonjour,

Pour répondre à votre besoin, vous pouvez créer une fonction personnalisée dans l'Éditeur de fonction de QGIS. Pour cela :

  - Ouvrez la calculatrice de champs ;
  - Cliquer sur l'onglet "Éditeur de fonction"
  - Cliquer sur le symbole '+' en vert pour ajouter une nouvelle fonction et nommer la;
  - Dans l'encart du haut; copier-coller le code suivant :

Code:

import re

@qgsfunction(args='auto', group='Custom')

def regexp_matchV2(word, reference, feature, parent):

    max_consecutive = 4  # Vous pouvez ajuster cette valeur si nécessaire
    
    for i in range(len(word) - max_consecutive + 1):
        substring = word[i:i + max_consecutive]
        if re.search(substring, reference):
            return True
    return False

- Cliquer sur "Enregistrer et charger les fonctions" (en bas à droite de l'encart) ;
  - Retourner sur l'onglet "Expression" ;
  - Vous trouverez la fonction 'regexp_matchV2()' dans le groupe "Custom" ;
  - Enfin, dans votre CASE WHEN remplacer 'regexp_match()'  par 'regexp_matchV2()'.

En espérant que cela vous soit utile,

Robin B

Hors ligne

 

#3 Mon 07 August 2023 21:50

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

Re: QGIS: selectionner valeur dans un champ par une suite de lettres ?

Bonjour,

Je ne connais pas dans le détail votre besoin mais à la lecture de votre message j'ai l'impression que les fonctions de correspondance floue pourraient être utiles
https://docs.qgis.org/3.28/fr/docs/user … -functions

Hors ligne

 

#4 Tue 08 August 2023 14:44

bastiencarto
Participant occasionnel
Date d'inscription: 5 Nov 2020
Messages: 11

Re: QGIS: selectionner valeur dans un champ par une suite de lettres ?

Bonjour,

Merci Robin B pour ce code et l'explication étape par étape car je ne connaissais pas l'éditeur de fonction ! Il fonctionne parfaitement.
Merci aussi p.jeremie, pendant mes recherches je n'étais pas tombé sur les fonctions de correspondance floue mais j'arrive à ce résultat là :

Code:

CASE WHEN
 length(longest_common_substring( lower( "adresse"),'manosque'))>= 4
 THEN 
'04100'
END

Les résultats ne sont pas sur à 100% en fonction des valeurs de vos bases, mais cela suffit à faire un premier très gros tri !

Hors ligne

 

Pied de page des forums

Powered by FluxBB