Bonjour tout le monde,
Voilà, j'ai eu un petit casse-tête à résoudre (que je me suis infligé ). C'est du parsing, donc je me disais qu'une regex ferait l'affaire.
Et bien j'ai eu beau tourner le problème dans tous les sens, je n'y suis pas parvenu avec une regex unique, alors je me suis débrouillé autrement. Ma solution est moins bonne, moins belle et moins efficiente que celle que j'espérais, mais ça marche.
Alors j'aimerais savoir s'il y en a ici qui seraient capables de le résoudre. Moi, ça me paraît impossible, et j'aimerais savoir si j'ai tort.
Rentrons dans le vif du sujet: j'ai une liste de fichiers qui suivent une convention de nommage assez "flexible" disons (liste écrite dans un fichier texte).
La voici, les crochets représentant les choses facultatives
Voici les regex correspondant aux différents éléments:
Code : Sélectionner tout - Visualiser dans une fenêtre à part date[ - type_depense] - description_depense[ - depense]extension
Quelques exemples d'entrées valides:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12 jour="[0-9]{2}" mois="[0-9]{2}" annee="[0-9]{4}|[0-9]{2}" separateur_date="[-:.]" date="($jour)$separateur_date($mois)$separateur_date($annee)" type_depense="(Perso|Professionnelle)" description_depense="(.*)" montant="[0-9]+,[0-9]{1,2}" devise=" ?[a-zA-Z]{3}" depense="($montant)($devise)?" extension="\.[a-zA-Z0-9]{3,4}"
23:02:09 - Professionnelle - Ma description - 43,06EUR.png
23-02-09 - Perso - Ma-description - 43,06 EUR.png
23.02.2009 - Professionnelle - Une autre desciption - 43,06.jpg
23:02:09 - Description - 43,06.pdf
23-02-09 - Une-dernière-description.gif
Le challenge est d'extraire les informations utiles: le jour, le mois, l'année, le type de dépense, la description, le montant et la devise et de les mettre dans un fichier CSV (fichier texte où chaque élément utile de chaque ligne est placé entre des point-virgules).
[Edit] Oubli qui a son importance: le type de dépense et la description doivent être mis entre guillemets dans le fichier CSV. D'autre part, la date doit être formatée comme suit: jour/mois/année
MAIS, et c'est ici que ça se corse, en utilisant une seule regex et une seule fois sed (ou un autre programme utilisant les regex POSIX). Pour ceux qui ont l'habitude des regex, le vrai challenge est de se passer des qualificateurs non gourmands et des assertions, et plus généralement de tout ce qu'on retrouve dans les PCRE mais pas dans les regex POSIX.
Voilà, moi je n'y suis pas parvenu et j'ai dû "tricher" en remplaçant d'abord le séparateur " - " par un séparateur à un seul caractère (le point virgule) et en utilisant une classe d'exclusion (description_depense devient "[^;]+").
Alors, si quelqu'un parvient à résoudre ce problème, il aura… toute mon admiration, car pour moi c'est un problème impossible à résoudre avec les regex POSIX.
Bon courage et bonne chance à ceux qui voudront relever le challenge.
PS: s'il faut y'a une solution toute simple à laquelle je n'ai pas pensé et je vais passer pour un débile, mais bon tant pis
Partager