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