[PERL] conversion des dates

Fermé
stephane - 24 août 2006 à 14:00
lami20j Messages postés 21331 Date d'inscription jeudi 4 novembre 2004 Statut Modérateur, Contributeur sécurité Dernière intervention 30 octobre 2019 - 7 mars 2007 à 16:30
Bonjour,

Je me bats contre une conversion de dates en Perl. Voici le problème :

je dois convertir des chaînes du type "de 01/85 à 01/99" en ceci : "de 01/1985 à 01/1999".
Une difficulté supplémentaire vient du changement de siècle : "de 01/99 à 01/02" par exemple doit devenir évidemment "de 01/1999 à 01/2002".
Pour gâter l'affaire, j'ai également des chaines du type "après xx/xx" ou "avant xx/xx".

Je n'ai pas trouvé de fonction qui me permettait de faire cela, et les expressions régulières ne m'ont pas aidé non plus...

Merci d'avance,

5 réponses

lami20j Messages postés 21331 Date d'inscription jeudi 4 novembre 2004 Statut Modérateur, Contributeur sécurité Dernière intervention 30 octobre 2019 3 567
24 août 2006 à 17:21
Salut,

je vais essayer te t'aider mais j'ai besoin de savoir la plage que tu dois couvrir

tu vas avoir besoin de 02 pour 1902 ou 1802 .....?!

pareil pour 03 jusqu'à 09 par exemple

Et aussi si tu peux dire d'où tu obtiens ces données. Peut être il y a des moyens pour mieux faire.

Et s'il n'y a pas une fonction et on va avoir besoin alors on va la crée sinon je crois que avec les regex on va s'en sortir.

Mais pour ça j'ai besoin de plus de détails.

lami20j

P.S. 01/85 ce n'est pas un date mais un division de chaînes de caractères si on parle d'une opération ou tout simplement un chaîne de caractère qui ne veut rien dire
0
Merci pour ta réponse.
Je t'en dis plus : je traite un fichier Excel, exporté au format CSV. Ce fichier Excel comporte de nombreuses colonnes. La colonne des dates m'intéresse tout particulièrement; elle s'étend sur une plage qui va de 1970 à 2006. La date mini ne sera jamais inférieure à 1970; la maxi suivra le calendrier.

Sous Excel, les dates sont un peu organisées n'importe comment; quelques exemples :

-> 1987
-> 01/98
01/98-06/02
1978->
01.05-02.06

Je cherche, en Perl, à créer une automatisation de la mise en forme de ce champs date, qui doit être formaté suivant des critères bien précis :

->1987 va être formaté en "avant 1987"
->01/98 va être formaté en "avant 01/1998"
01/98-06/02 va être formaté en "de 01/1998 à 06/2002"
1978-> sera formaté en "après 1978"
01.05-02.06 sera formaté en "de 01/2005 à 02/2006

Donc : remplacement des "." par des "/", etc

Je me suis servi beaucoup des expressions régulières, avec ton aide. Mais là, je ne vois pas comment m'en sortir.


Merci,
0
lami20j Messages postés 21331 Date d'inscription jeudi 4 novembre 2004 Statut Modérateur, Contributeur sécurité Dernière intervention 30 octobre 2019 3 567
24 août 2006 à 22:38
Re,

j'avoue que tu ne m'aide pas trop.

Pourquoi tu n'utilise Excel directement pour faire une mise en forme des dates?! Tu dois avoir tes raisons mais si tu ne dit pas alors je ne peux pas comprendre exactement ce que tu veux.

Tu dis que tu exportes en CSV. Pourquoi ne fait tu un format cellule pour formater la date jj/mm/aaaa et ensuite tu fait l'exportation.

Un exemple pour te montrer qu'il peut avoir des confusions.

01/98 peut être 01/1998 mais il peut être aussi 01/2098

Et je repete, une fois que tu as exporté en CSV tu n'as plus des dates mais de chaînes de caractères dont tu veux changer l'affichage, je ne veux pas utiliser format.

Par exemple

my $d = "-> 1987 ";
$d =~ s/^->\s*(\d{4})/avant $1/;
ou pour
my $d2 = "01/98";
$d2 = ~ s/^->\s*(\d\d)\/([7-9][0-9])/avant $1\/19$2/;
Mais comme je t'ai dit ce n'est pas excellent 01/70 peut être aussi 01/2070, etc....

Si tu me donnes ton fichier excel je peux voir mieux.
Mais je crois que le formatage de dates avant l'exportation en CSV c'est la meilleure solution.

lami20j

P.S. Il y a aussi des modules sur CPAN pour traitement de fichiers Excel avec Perl
https://metacpan.org/search?q=excel
0
Merci pour le lien CPAN, je vais étudier ca.

La difficulté de la mise en forme sous Excel, c'est que j'ai à peu près tout essayé, mais aucun formatage de date ne m'a permis de transformé un 01/99 en 01/1999. Mais là je reconnais que j'en ai peut-être conclu hativement que ce n'était pas faisable.

Plus globalement, je traite de nombreux fichiers Excel d'environ 4000 lignes chacun. Même en automatisant au maximum (avec des rechercher/remplacer par), j'ai 2h de boulot par fichier. L'idée était de créer un programme Perl qui fasse tout cela, au moins un maximum, les champs intraitables étant marqués xxxx par exemple.

Les expressions régulières m'ont permis de mettre en forme la plupart des dates; il ne reste plus que ce satané pb de format mm/aaaa.


Et puis, à ma décharge, je dois étudier Perl pour la rentrée universitaire, c'était l'occasion de lier l'utile à l'agréable.
0
lami20j Messages postés 21331 Date d'inscription jeudi 4 novembre 2004 Statut Modérateur, Contributeur sécurité Dernière intervention 30 octobre 2019 3 567
25 août 2006 à 09:44
Salut,

Ca ne m'interesse pas ce que tes fichiers contient.
En revanche si tu me donne (https://www.cjoint.com/ ) un fichier je pourrai regarder de prés et te dire si c'est faisable ou pas.

A toi de voir.

lami20j
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
my ($mday ,$mon, $year ,$numjoursemaine)=(localtime) [3..6];
my @lesmois = ("Janvier" , "Fevrier" , .....);
my @lesjours = qw (Dimanche Lundi Mardi....);
$year+=1900;
print "$lesjours [$numjoursemaine] $mday $lesmois [$nom]$year;

voila ca fonctionne niquel
0
lami20j Messages postés 21331 Date d'inscription jeudi 4 novembre 2004 Statut Modérateur, Contributeur sécurité Dernière intervention 30 octobre 2019 3 567
7 mars 2007 à 16:30
Salut,

la question était
Je me bats contre une conversion de dates en Perl. Voici le problème :

je dois convertir des chaînes du type "de 01/85 à 01/99" en ceci : "de 01/1985 à 01/1999".


Tu n'es pas cohérent dans ta façon d'écrire le code

my @lesmois = ("Janvier" , "Fevrier" , .....);
my @lesjours = qw (Dimanche Lundi Mardi....);


autant écrire
my @lesmois = ("Janvier" , "Fevrier" , .....);
my @lesjours = ("Dimanche" , "Lundi" , "Mardi" , ....); 
ou
my @lesmois = qw (Janvier Fevrier .....);
my @lesjours = qw (Dimanche Lundi Mardi....); 


perso j'aurai écrit (pour lisibilité)
@lesmois = qw { Janvier Fevrier  Mars
                Avril   Mai      Juin
                Juillet Aout     Septembre
                Octobre Novembre Decembre  };

Perl permets une grande liberté. Chacun écrit le code comme il veut. Le pire sera à la maintenance de code.
0