Extraire des caractères d'une BDD
Bonsoir,
J'ai une liste d'espèces floristiques (1 colonne) dans laquelle j'essai, sans succès, d'extraire une partie des informations.
L'inconvénient avec cette liste c'est que je ne parviens pas à trouver un élément identique dans chaque cellule, qui me permettrait de mieux appréhender le problème.
En l'occurrence la base de données se compose d'un nom de genre et d'espèce suivi d'informations sur le découvreur.
Le nom du découvreur / l'année de découverte sont des informations qui m'empêchent d'appliquer d'autres formules (prendre les 4 première lettre du genre, prendre les 4 premières lettres de l'espèce, si "var alors prendre "var." puis les 4 premières lettre qui suivent, si "subsp" prendre "subsp." puis les 4 premières lettre qui suivent, etc. Et quand il y a le nom du découvreur, ça créé d'innombrables erreurs.
Je joins un document Excel pour que vous puissiez voir plus clairement.
J'ai la possibilité d'isoler les "var." ; les "subsp." etc. et donc d'obtenir des plages de données distinctes avec des compositions plus ou moins similaires.
Une formule qui pourrait fonctionner serait de demander :
"Après le premier "-" Prendre les données jusqu'au 2nd espace"
"Après le premier "-" Prendre les données jusqu'au 3ème espace"
"Après le premier "-" Prendre les données jusqu'au 4ème espace"
etc.
Merci de votre attention !
Bonne soirée.
Bonjour,
Mets quelques résultats que l'on ne perde pas de temps !...
Cdlt.
Salut Le Drosophile,
quelque chose comme ça?
Un double-clic démarre la macro.
Pour un cas, je suppose qu'il faut aller plus loin :
ACHILLEA X THOMASIANA HALLER F. EX MURITH, 1810
où j'obtiens
ACHILLEA X THOMASIANA HALLER
J'imagine que HALLER doit disparaître?
Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)
'
Dim tData
Dim sFlag As String
'
Cancel = True
'
tData = Range("A2:B" & Range("A" & Rows.Count).End(xlUp).Row).Value
For x = 1 To UBound(tData, 1)
If InStr(CStr(tData(x, 1)), "(") > 0 Then
tData(x, 2) = Trim(Left(tData(x, 1), InStr(CStr(tData(x, 1)), "(") - 1))
ElseIf InStr(CStr(tData(x, 1)), " EX") > 0 Then
sFlag = Left(CStr(tData(x, 1)), InStr(CStr(tData(x, 1)), " EX") - 1)
tData(x, 2) = Trim(Left(sFlag, InStrRev(sFlag, Chr(32)) - 1))
ElseIf InStr(CStr(tData(x, 1)), ",") > 0 Then
sFlag = Left(CStr(tData(x, 1)), InStr(CStr(tData(x, 1)), ",") - 1)
tData(x, 2) = Trim(Left(sFlag, InStrRev(sFlag, Chr(32)) - 1))
ElseIf Right(CStr(tData(x, 1)), 1) = "." Then
sFlag = Trim(CStr(tData(x, 1)))
Do While Right(sFlag, 1) = "."
sFlag = RTrim(Left(sFlag, InStrRev(sFlag, Chr(32))))
Loop
tData(x, 2) = sFlag
Else
tData(x, 2) = Trim(tData(x, 1))
End If
If InStr(tData(x, 2), "-") > 0 Then tData(x, 2) = Right(tData(x, 2), Len(tData(x, 2)) - InStr(tData(x, 2), "-") - 1)
Next
Range("A2").Resize(UBound(tData, 1), 2).Value = tData
Columns("A:B").AutoFit
'
End SubA tester,
A+
Bonjour à tous
plutôt que de se lancer tête baissée, si on reprenait au début...
d'où sort le fichier à traiter ?
peut-on connaître l'orgine des données ? car alors, il est bien possible que le menu Données Récupérer fasse des miracles en allant lire directement dans la source et non dans un fichier Excel mal foutu.
Bonjour,
@ jmd,
La question fait suite à un post précédent, résolu (?) avec Power Query.
https://forum.excel-pratique.com/viewtopic.php?f=2&t=112679&p=674881#p674881
Pour ma part, j'attends un complément d'informations !...
Cdlt.
merci Jean-Eric
j'attends avec toi
Bonjour,
Voici un document Excel plus parlant ; j'ai trié les données car autrement c'est très probablement impossible à traiter.
J'ai notamment séparer les "Var." et "Subsp".
L'idée (avec exemple dans le document à est de sortir le nom des découvreurs.
Il y a peut-être une possibilité en comptant les espaces ; ainsi pour des noms simples :
GENRE ESPECE NOM DECOUVREUR : on peut demander à supprimer tout ce qui se situe à la suite du 2nd espace.
Pour les variétés (et sous espèces):
GENRE ESPECE var. VARIETE : on peut demander à supprimer tout ce qui se situe à la suite du 4ème espace.
Les données sont issues d'un fichier qu'on appelle "TAXREF" => Référentiel taxonomique
Il recense toutes les espèces connues pour le territoire français (en l'occurrence).
J'ai du trier le document car l'organisation est pas au top, il y a des erreurs de saisie, des "," ; des " ' " ou tout autres symboles qui se promènent, les sous catégories, qui ne sont pas toujours nommées de la même façon, etc.
J'espère avoir été plus clair dans ces explications.
A plus tard !
re
TAXREFV11.txt issu de https://inpn.mnhn.fr/telechargement/referentielEspece/taxref/11.0/menu#
TAXREF_INPN_v11.zip
n'a pas les problèmes que tu décris
donnes-nous les coordonnées EXACTES du fichier
Dans TAXREF V11 allez dans la colonne "NOM_VALIDE" ; vous aurez les données dont nous parlons.
La seconde colonne (C) dans mon document concatène "NOM_COMPLET" et "NOM_VALIDE" en mettant les "NOM VALIDEs" en majuscule.
J'ai trouvé la solution finalement :
J'utilise la formule suivante : =DROITE(B2;NBCAR(B2)-TROUVE(" ";B2;TROUVE(" ";B2)+1))
Qui me permet d'extraire les noms des découvreurs, que je supprime ensuite via SUBSTITUTE.
Pour les noms contenant var. ; subsp. etc.
Je m'y prend comme suit :
=DROITE(B2;NBCAR(B2)-TROUVE(" ";B2;TROUVE(" ";B2)+1)-TROUVE(" ";B2)-1)
Avec ça je n'extrait pas toujours que le nom du découvreur.
Je copie-colle la colonne puis y applique la même formule :
=GAUCHE(E2;CHERCHE(" ";E2))
Et ensuite même traitement via SUBSTITUTE.
C'est assez hasardeux comme méthode, et quelque chose de plus propre m'aurait intéressé, en l'occurrence ça fait l'affaire.
Merci @curulis57 je vais tester ce que tu proposes, bien que j'ai encore du mal à saisir la manière dont ça fonctionne
Je laisse la discussion comme non résolue pour le moment, si vous souhaitez proposer une formule mieux construite, sans bidouillage.
A plus tard.
Bonjour,
Dans le fichier TAXEFv11.txt, tu as une colonne LB_NOM.
Peux-tu nous dire pourquoi tu ne l'utilises pas ?
Cdlt.
Bonsoir,
La colonne LB_NOM correspond aux noms inscrits dans la colonne NOM_COMPLET ; mais sans les découvreurs. Ce serait alors parfait, et c'est ce dont je me suis servi au départ.
Sauf que cette colonne condense la totalité des noms utilisés pour la même espèce, il s'agit donc de synonymes et il y en a une quantité affolante ; lorsque j'ai des doublons, grâce à l'aide obtenue sur ce forum, j'ai un document capable de faire des propositions de correspondances à choisir dans une liste déroulante. Ça marche parfaitement, mais il beaucoup trop de synonyme et au final le tiers des codes pour lesquels je recherche une correspondance sont utilisés plusieurs fois.
C'est pénible, surtout pour un document que je souhaiterais le plus automatisé possible ; d'autant plus que les synonymes ne sont pratiquement pas utilisés.
La colonne NOM_VALIDE ne renseigne que les noms utilisés à ce jour ; chaque nom de genre / espèce est alors dédoublé autant de fois qu'il y a de synonymes. Je souhaite utiliser cette planche de données car elle sera plus légère et qu'en supprimant les doublons j'aurais, je l'espère, un document plus proche de ce que je recherche.
Malheureusement, dans cette colonne le nom des découvreurs est présent et il n'y a pas de colonne dans laquelle cette info serait retirées.
Bonne soirée.
Salut Le Drosophile,
et ACHILLEA X THOMASIANA HALLER F. EX MURITH, 1810 = ACHILLEA X THOMASIANA ?
Tu ne réponds toujours pas...
A+
Re,
Pour résumer, peut-on penser que la colonne NOM_Valide diminué de LB_Auteur correspond au résultat recherché ?
Cdlt.
P..., le Drosphile, t'es pas au taquet, camarade!!
Une fois pour toutes, peut-on avoir LE fichier que tu veux voir être traité par nos formules ou codes?
Et pas 25 lignes, 1000 ou plus qu'on puisse se rendre compte des difficultés et autres particularités que tes exemples nous "cachent" peut-être...
A+
Merci @curulis57
je vais tester ce que tu proposes, bien que j'ai encore du mal à saisir la manière dont ça fonctionne. Wow, eh bien ça marche aussi parfaitement !
Eh bien, comme je disais, ça marche parfaitement ; ta méthode est la plus rapide et la plus simple ; par contre je dois l'étudier car pour le moment ce qui est code VBA (si c'est bien ça) je ne comprend pas vraiment.
Le document que j'ai transmis contient tout ce qu'il faut pour résoudre mon problème (les exemples regroupent tous les cas de figure qui me posent problème) ; je ne souhaite pas que l'on me fasse le travail ; pour beaucoup d'entre vous ça prendrait 5 minutes sans se creuser la tête ; mais dans ces conditions je ne pourrais rien apprendre.
Re,
Pour résumer, peut-on penser que la colonne NOM_Valide diminué de LB_Auteur correspond au résultat recherché ?
Cdlt.
C'est bien cela.
En PJ je joins le document qui indique les différentes situations, pour lesquelles j'ai utilisé les formules TROUVE et SUBSTITUE.
Pour ce faire j'ai, au préalable, séparer chaque cas de figure dans une feuille différente pour adapter les formules (notamment "TROUVE").
Bonne soirée !
Et je n'ai toujours pas ma réponse...
Je vais regarder ça de suite.
EDIT :
En effet, avec votre solution il reste parfois des restes de noms de découvreurs :
ACHILLEA X THOMASIANA HALLER
ACER PSEUDOPLATANUS F. PURPURASCENS PAX
Ce sont les deux erreurs que je vois ; étrange puisque ça fonctionne pour tout le reste ! (des données en exemple).
Je ne peux pas te transmettre l'ensemble des données car le fichier est trop volumineux.
C'est bien pour ça que je réclame un fichier plus fourni avec les explications qui me permettent de déterminer comment programmer l'affaire.
Par exemple, as-tu une nomenclature des terminaisons des noms de plantes qui me permette de déceler les intrus?
Comme, ENS, US, NA,... que sais-je? Cela pourrait aider à éliminer des HALLER, PAX qui n'ont rien à voir en botanique, que je sache...
Le fichier de ton dernier post comprend-t-il suffisamment d'exemples (je ne l'ai pas encore ouvert...) ?
A+
Je mets en PJ un fichier avec les 10 000 premières lignes, j'espère que tous les exemples seront présents.
Je n'ai pas ça.Par exemple, as-tu une nomenclature des terminaisons des noms de plantes qui me permette de déceler les intrus?
Comme, ENS, US, NA,... que sais-je?
Non mon fichier précédent est surtout là pour montrer la méthode utilisée pour résoudre le problème à ma manière. C'est un peu brouillon mais ça donne le résultat escompté.
Salut Le Drosophile,
peux pas faire mieux pour l'instant...
Un double-clic démarre la macro.
Le seul cas non résolu est celui d'un mot en dernière position sans aucun "." signalant une initiale : le mot est maintenu, que ce soit un NOM de découvreur (L.2 : ABUTILON MANGAREVICUM FOSBERG) ou, parfois, tant mieux une extension du nom de la plante (L.49 : ABIES ALBA X ABIES NORDMANNIANA) ;
Difficile de faire la part des choses d'où ma demande d'une nomenclature de terminaisons latines même limitée aux essentielles.
Les exemples des lignes 3 et 4 ont été résolus d'une manière un peu... "expérimentale", à la hussarde et à la condition de la présence d'un "." dans l'item.
Le temps me manque pour parfaire et compléter mon idée.
- Ligne 3 : s'il reste un mot après une initiale suivie d'un ".", je compare les dernières lettres de ce mot avec quelques terminaisons latines fréquentes pour le garder ou non ;
- Ligne 4 : s'il reste plus d'un mot, je teste le dernier mot de la même manière pour le garder ou non.
Je vais parfaire cela et appliquer cette méthode au cas de la ligne 2.
Je n'ai pas pu scruté les 10.000 lignes mais, je ne me voile pas la face et je ne crie pas victoire : j'ai vu quand même que certains cas n'auraient pas pu être résolus sans la miraculeuse présence des parenthèses!
Et d'autres, que je vois à la volée et pas encore prévus :
- Acalypha lepinei J. Müller Argoviensis - ACALYPHA LEPINEI J. MÜLLER ARGOVIENSIS ;
- Acer cappadocicum Gled. subsp. cappadocicum - ACER CAPPADOCICUM GLED. SUBSP. CAPPADOCICUM ;
- Acer davidii Franch. var. davidii - ACER DAVIDII FRANCH. VAR. DAVIDII ;
- Achillea x bronchalensis Mateo, Fabado & C.Torres, 2008 - ACHILLEA X BRONCHALENSIS MATEO, FABADO & C.TORRES, 2008.
Bref, il y a encore quelques lignes à écrire...
Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)
'
Dim tData
Dim sFlag As String, iFlag%
'
Cancel = True
'
tData = Range("A2:B" & Range("A" & Rows.Count).End(xlUp).Row).Value
For x = 1 To UBound(tData, 1)
If InStrRev(CStr(tData(x, 1)), "(") > 0 And InStr(CStr(tData(x, 1)), "- ") < InStrRev(CStr(tData(x, 1)), "(") Then
tData(x, 2) = Trim(Left(tData(x, 1), InStrRev(CStr(tData(x, 1)), "(") - 1))
ElseIf InStr(CStr(tData(x, 1)), " EX ") > 0 Then
sFlag = Left(CStr(tData(x, 1)), InStr(CStr(tData(x, 1)), " EX ") - 1)
tData(x, 2) = Trim(Left(sFlag, InStrRev(sFlag, Chr(32)) - 1))
ElseIf InStrRev(CStr(tData(x, 1)), ",") > 0 And InStr(CStr(tData(x, 1)), "- ") < InStrRev(CStr(tData(x, 1)), ",") Then
sFlag = Left(CStr(tData(x, 1)), InStrRev(CStr(tData(x, 1)), ",") - 1)
tData(x, 2) = Trim(Left(sFlag, InStrRev(sFlag, Chr(32)) - 1))
End If
tData(x, 2) = IIf(tData(x, 2) = "", tData(x, 1), tData(x, 2))
If InStrRev(tData(x, 2), "- ") > 0 Then tData(x, 2) = Right(tData(x, 2), Len(tData(x, 2)) - InStrRev(tData(x, 2), "- ") - 1)
If InStr(tData(x, 2), "+ ") > 0 Then tData(x, 2) = Right(tData(x, 2), Len(tData(x, 2)) - InStr(tData(x, 2), "+ ") - 1)
If InStr(tData(x, 2), " &") > 0 Then
sFlag = Left(CStr(tData(x, 2)), InStr(CStr(tData(x, 2)), " &") - 1)
tData(x, 2) = Trim(Left(sFlag, InStrRev(sFlag, Chr(32)) - 1))
End If
sFlag = IIf(tData(x, 2) = "", Trim(CStr(tData(x, 1))), Trim(CStr(tData(x, 2))))
If InStrRev(sFlag, ".") Then
iFlag = InStrRev(sFlag, ".")
If (Mid(sFlag, iFlag - 3, 3) <> "VAR" And Mid(sFlag, iFlag - 5, 5) <> "SUBSP") Or iFlag = Len(sFlag) Then
If InStrRev(sFlag, Chr(32)) - iFlag = 1 Then
If Right(sFlag, 2) <> "US" And Right(sFlag, 3) <> "IAE" And Right(sFlag, 2) <> "UM" And Right(sFlag, 2) <> "IS" And Right(sFlag, 2) <> "II" Then
sFlag = Left(sFlag, InStrRev(sFlag, "."))
Do While Right(sFlag, 1) = "."
sFlag = RTrim(Left(sFlag, InStrRev(sFlag, Chr(32))))
Loop
End If
Else
If Right(sFlag, 2) <> "US" And Right(sFlag, 3) <> "IAE" And Right(sFlag, 2) <> "UM" And Right(sFlag, 2) <> "IS" And Right(sFlag, 2) <> "II" Then sFlag = Left(sFlag, InStrRev(sFlag, Chr(32)) - 1)
End If
End If
End If
tData(x, 2) = sFlag
Next
Range("A2").Resize(UBound(tData, 1), 2).Value = tData
Columns("A:B").AutoFit
'
End SubA+