1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52
| use Date::Calc qw(:all); # le package pour des fonctions sur les dates
open (FHI, "table_event.csv") or die("cannot open table_event.csv"); # ma table contenant les infos que je récupère
open (FHA, ">table_event_finale.csv") or die("cannot create table_event_finale.csv"); # la table ou je réécrirai les infos récupérée en ajoutant les épisodes
while ($line = <FHI>) { # parcourt ligne par ligne de la table
@line = split ("\t", $line); # split des colonnes sur les tabulations
if ($line[4] == "\\N") { # dans le cas des event n'ayant pas de dates...
$line[4] = '1900-01-01'; # écriture d'une date par défaut qui permettra l'incrémentation de l'épisode pour au moins le 1er event
} # \N est interprété sous MySQL comme un champs NULL.
$id {$line[1]}{$line[0]} = $line[4]; # Création d'une table de hash id comme indiqué dans mon 1er post : l'id => (les) event => (les) date(s)
}
close FHI;
foreach $elm (sort keys(%id)) { # Et parcourt de la table, pour chaque identité (en triant ces id qui sont sous forme d'un code numérique)
$e = 0; # initialisation de l'épisode à 0.
$date0 = '1900-01-01'; # création d'une chaine contenant une date par défaut, nécessaire pour le calcul de la première différence de date
foreach $event (sort keys %{$id{$elm}}) { # Pour l'identité en cours (1ère boucle), parcourt de tous ses event
$date = $id{$elm}{$event}; # on récupère la date de l'event de la boucle en cours dans une variable
( $annee, $mois, $jour ) = split ('-', $date); # split de la date récupéré, dans trois variables
( $annee0, $mois0, $jour0 ) = split ('-', $date0); # split de la date créée par défaut, dans trois variables
$diff = $annee - $annee0; # soustraction de l'année en cours par l'année par défaut (permet de palier partiellement au problème de ce script)
$nb = Delta_Days( ( $annee0, $mois0, $jour0 ), ( $annee, $mois, $jour ) ); # calcul la différence du nombre de jours entre deux dates. La date en cours moins la date par défaut au premier tour...
# aux tours suivants c'est la date en cours qui servira de date de base ($date0)
if($nb >= 183 || $diff >= 1 ) { # si il y a environ 6 mois entre deux dates, ou une différence d'un an
$e++; # incrémentation d'un de l'épisode, la date par défaut en 1900 permet de passer obligatoirement le 1er event à 1
}
$date0 = $date; # la date en cours devient la nouvelle date qui sera soustraite au tour suivant
if($id{$elm}{$event} == '1900-01-01') { # remplacement de la date par NULL si jamais je lui avais attribué la valeur par défaut
$id{$elm}{$event} = "\\N\n";
}
print FHA ("$event\t$elm\t$e\t$_\t$id{$elm}{$event}"); # et écriture de ma nouvelle table
}
}
close FHA;
print "\n";
print "################\n";
print "# The End! #\n";
print "################\n";
<>; |
Partager