Comparaisons approximatives
Bonjour.
Je souhaiterais savoir si il est possible de créer une comparaison approximative, c'est-à-dire que si deux chaînes de caractères ont une partie commune, on peut les considérer comme identique.
Je m'explique : le but est de comparer des chaîne de caractères, et si certains enchaînements de l'une se retrouve dans l'autre, alors on la condition est remplie et on applique une formule (somme, par exemple).
Imaginons que dans un premier fichier, on ait "abcd ef gh" et une valeur de "10" rattachée, et dans un autre on ait "pofg abcd jje". On voit qu'une partie de la première chaîne ("abcd") est présente dans la seconde ; donc, ce que je souhaiterai c'est que ce fameux test nous dise "ces deux chaînes sont très similaires, alors je rattache la valeur de 10 de la chaîne test à la chaîne du second fichier".
J'ai plusieurs fichiers dont je souhaiterais croiser les données, et la seule référence commune est le nom de mes fournisseurs. Hors, ce dernier n'est pas renseigné à l'identique dans chacun de ces fichiers : il peut être tronqué, raccourci, avec ou sans le statu de l'entreprise (SA, SAS, ...). Étant en partenariat avec plus de 3000 entreprises, et devant travailler sur plusieurs fichiers différents, je voudraiS éviter de devoir manuellement corriger tous les noms.
D'avance je vous en remercie beaucoup.
bonjour,
voici une fonction qui fait ce que tu as demandé mais je doute que ce soit suffisant.
la fonction : Si chaine de caractères de texte 1 délimitée par des espaces est trouvée dans texte 2, resultat de la fonction est vrai, sinon faux.
Function similaire(t1, t2) As Boolean
s1 = Split(t1)
For i = LBound(s1) To UBound(s1)
If InStr(" " & t2 & " ", " " & s1(i) & " ") > 0 Then similaire = True: Exit Function
Next i
similaire = False
End Function
ce que je ferais : supprimer toutes les occurrences qui n'ont rien à voir avec le nom (sa, sas, ...), supprimer toutes les ponctuations et caractères spéciaux, remplacer les caractères accentués par non accentués, et faire une recherche de similarité avec une fonction type Levenshtein.
Salut salut, et merci de ton retour.
Effectivement, ça se rapproche de ce que je souhaite. Je vais tester cette fonction et faire un retour. Pour être honnête, j'étais assez sceptique quant à la résolution de ma problématique.
++
Bonjour,
la distance de levenshtein mesure l'écart entre 2 mots. Plus le score est important, plus ils sont distants.
Pour elle, contrairement à ce que tu penses, "abcd ef gh" et "pofg abcd jje" sont très éloignés, à voir si ça te va
Les traitements sur chaines sont très consommateurs de ressources et lents.
Si tes listes sont longues je te conseille d'installer l'utilitaire fuzzy lookup (recherche floue) de MS.
C'est une dll et donc considérablement plus rapide : MS fuzzy lookup
eric