Extraction par expression rationnelle

dede125a

Membre confirmé
2 Décembre 2004
63
7
53
ici moins qu'ailleurs
Salut tout le monde,

Je dois programmer une extraction de donnée à partir de fichiers textes qui seront mis en place sur un serveur

Un extrait du fichier brut :
Bloc de code:
GLOUBIBOULGA					|JEAN - FRANCOIS		 |F|1986/03/11|0117467281 |0860995P|0860054S|450|1|33104|E|
TARTARIN					|SOPHIE - HELENE		  |F|1987/07/31|0117467282 |0860995P|0860054S|450|1|33104|D|
FY					   |SEBASTIEN				 |F|1986/08/17|0117467283 |0860995P|0860054S|450|1|33104|E|


Au final je veux obtenir ces information (celles en rouge) :
GLOUBIBOULGA |ORLANE - HARMONY |F|1986/03/11|0117467281 |0860995P|0860054S|450|1|33104|E|

Je me suis donc fendu d'une expression rationnelle pour faire le boulot, que voici :
Bloc de code:
([A-Z]*[\s-]?[A-Z]+[\s-]*[A-Z]+[\s-]*[A-Z]+)\s*\x7C([A-Z]+[\s-]*[A-Z]+[\s-]*[A-Z]+[\s-]*[A-Z]+)\s*\x7C.\x7C[0-9]{4}/[0-9]{2}/[0-9]{2}\s*\x7C([M0-9]{10})\s*\x7C[A-Z0-9]{8}\x7C[A-Z0-9]{8}\x7C[0-9]{3}\x7C[1-9]{1}\x7C[0-9A-Z]{5}\x7C([A-Z]{1})\x7C

L'expression marche nickel sauf dans 1 cas :( celui où le nom de la personne ne fait que 2 lettres (comme dans la 3e ligne de mon exemple).
J'ai fait un peut le tours de ce que je savais en expression rationnelles et là, je sèche. Donc si parmi l'aimable assistance, il y a qq'un qui est un champion de ce genre de chose, je lui serait très reconnaissant de son aide !

Par avance merci.
 
Bon je suis pas une brute en expressions régulières, mais de toutes évidences ça ça identifie le nom :
([A-Z]*[\s-]?[A-Z]+[\s-]*[A-Z]+[\s-]*[A-Z]+)
ça me parait déjà bien compliqué par rapport à ce que ça fait, ils sont sensés avoir quel format exactement tes noms ?
Et le caractère "+" signifie "une ou plusieurs fois le/les caractère cité".
Comme tu as 3x [A-Z]+ ça me parait logique qu'il faille au moins 3 caractères entre A et Z.
 
Merci pour ta remarque très judicieuse et qui m'a mis effectivement sur e chemin de la solution :zen:

Pour répondre à ta question, j'ai multiplié la recherche des occurrences de noms pour palier au fait que ce certains noms son composés de 3 voir 4 parties (particules, noms asiatiques court comme "yu"...).

J'ai donc modifier mon expression (pour nom) comme suit :
Bloc de code:
([A-Z]{0,}[\s-]?[A-Z]{0,}[\s-]?[A-Z]{0,}[\s-]?[A-Z]+)
Ce qui permet de prendre en compte toutes les possibilités rencontrées dans mes enregistrements.
 
Oui mais là tu perds une partie de ce que tu voulais faire avec ta première expression non ? Il me semble que tu voulais avoir un mot pouvant être en 4 parties mais où les séparateurs entre ces parties ne pouvaient pas se retrouver en début ou fin de chaîne, je me trompe ?

C'est pas plutôt quelque chose de ce genre que tu voudrais :
Bloc de code:
([A-Z]+\([\s-]?[A-Z]*\)*)
Je suis pas sûr de la syntaxe exacte, en plus elle dépend peut-être de la commande avec laquelle tu la traites, mais tu vois l'idée... ;)
 
  • J’aime
Réactions: dede125a
Ma nouvelle expression marche correctement mais elle est beaucoup moins élégante que ta solution à l'exception près de la syntaxe en PERL qui est :
Bloc de code:
([A-Z]+(?:[\s-]?[A-Z]*)*)

Encore merci ;)
 
En fait c'est même plutôt à ça que je pensais, mais j'ai oublié de modifier :
Bloc de code:
([A-Z]+(?:[\s-]?[A-Z]+)*)
Puise que là justement on peut remettre le "+" pour se rapprocher de ta première version.
 
Tu peux pas simplement faire un split sur '|' et prendre les résultat qui t'interesse ?
 
Merci pour ces conseils ; mais la solution d'utiliser split ne permet pas en même temps de valider les informations au cas où il y aurait des erreurs dans le fichier (même s'il s’agit l'occurrence d'un fichier généré par une autre base de donnée, on ne peut pas se permettre une erreur sur des bases qui contiennent 600000 enregistrements). Vous me direz que rien ne m'empêche de faire des tests après ; mais là, c'est fait en une seule opération.

Maintenant tout roule impec :)