<?php
/*
Vérifie si le fichier local vacsi-a-fra.csv est à jour
Si nécessaire, le reconstruit à partir du fichier de référence sur internet
En extrait également les fichiers vacsi-age-(..).csv
*/
function testmaj_a_fra ()
{
// fichier qui sert à déterminer si une mise à jour est utile
$refdate = DIR_CSV."/vacsi-tot-a-fra.csv";
// fichier à mettre éventuellement à jour
$csv = "vacsi-a-fra.csv";
$chemcsv = DIR_CSV."/".$csv;
// si le fichier est à jour
if (filemtime ($refdate) <= filemtime ($chemcsv))
{
// on n'a rien à faire
message ("Fichier ".$csv." supposé à jour");
return;
}
// url du fichier de référence
$url = SITE_REF.vacsi_a_fra;
// ouvrir cet url en lecture
$descurl = fopen ($url, "r");
// si l'ouverture s'est bien passée
if ($descurl)
{
// sauter la première ligne de l'url
fgets ($descurl, LG_MAX_CSV * 2);
// comme la classe d'âge 09 est mal placée on commence
// par créer 2 fichiers qu'on fusionnera juste après
$nouvcsv1 = DIR_CSV."/vacsi-a-fra.new1";
$nouvcsv2 = DIR_CSV."/vacsi-a-fra.new2";
// les ouvrir en écriture
$descscv1 = fopen ($nouvcsv1, "w");
$descscv2 = fopen ($nouvcsv2, "w");
// si les ouvertures se sont bien passées
if ($descscv1 && $descscv2)
{
// lire la première ligne de l'url en oubliant "FR;"
$ligne_url = substr (fgets ($descurl, LG_MAX_CSV), 3);
// séparer les différents champs de la ligne
// on prévoie que des champs supplémentaires pourront apparaitre
$args = explode (";", trim ($ligne_url), 20);
// trouver le nombre de doses mémorisées
$doses = (count ($args) - 2) / 3;
// 2 colonnes seront à fusionner pour la dose 5
// à présent elle y est toujours, mais le test est explicatif
if ($doses > 5)
$doses --;
// tant que la dernière ligne lue fait référence à une classe d'âge
while ($ligne_url [2] == ";")
{
// réordonner le champ date et supprimer les champs inutiles
$ligne_url = selchamps_evol ($ligne_url, $doses);
// recopier la ligne dans le bon fichier
if ($ligne_url [0] == "0")
fputs ($descscv1, $ligne_url);
else
fputs ($descscv2, $ligne_url);
// lire la ligne suivante de l'url en oubliant "FR;"
$ligne_url = substr (fgets ($descurl, LG_MAX_CSV), 3);
}
// remplissage du fichier 2 terminé
fclose ($descscv2);
// on va rajouter son contenu au fichier 1
$descscv2 = fopen ($nouvcsv2, "r");
// si l'ouverture s'est bien passée
if ($descscv2)
{
// lire la première ligne du fichier 2
$ligne = fgets ($descscv2, LG_MAX_CSV);
// tant que non fin du fichier 2
while ($ligne)
{
// recopier la ligne dans le fichier 1
fputs ($descscv1, $ligne);
// lire la ligne suivante du fichier 2
$ligne = fgets ($descscv2, LG_MAX_CSV);
}
// terminé avec le fichier 2
fclose ($descscv2);
}
else
$erreur = "Problème pour terminer le fichier ".$csv;
// on rajoute les données corespondant à toutes les classes d'âge réunies
// tant que non fin de fichier csv
while ($ligne_url)
{
// réordonner le champ date, supprimer les champs inutiles
// et rebaptise la classe d'age générale
$ligne_url = "ta".substr (selchamps_evol ($ligne_url, $doses), 1);
// recopier la ligne dans le dernier fichier
fputs ($descscv1, $ligne_url);
// lire la ligne suivante de l'url en oubliant "FR;"
$ligne_url = substr (fgets ($descurl, LG_MAX_CSV), 3);
}
// fermer le fichier que l'on vient de créer
fclose ($descscv1);
// on remplace l'ancien fichier csv par le nouveau
rename ($nouvcsv1, $chemcsv);
// et on supprime celui qui a permit la fin de son remplissage
unlink ($nouvcsv2);
}
// sinon
else
// message d'erreur si on n'a pas pu créer le fichier
$erreur = "Problème pour créer le fichier ".$csv;
// terminé avec l'url
fclose ($descurl);
}
// sinon autre message d'erreur
else
$erreur = "Problème d'accés à l'URL pour mettre à jour le fichier ".$csv;
// si erreur durant cette première partie
if (! $erreur)
{
// l'afficher
message ($erreur);
// on ne fera pas la suite
return;
}
// 2ème partie : on crée un fichier par classe d'âge
// avec une information tous les 10 jours
// ouvrir en lecture le fichier csv qu'on vient de créer
$descscv = fopen ($chemcsv, "r");
// si l'ouverture s'est bien passée
if ($descscv)
{
// lire la classe d'âge
$cl_age = fgets ($descscv, 3);
// tant que non fin de fichier
while ($cl_age)
{
// si la classe d'âge a changé par rapport à la ligne précédente
if ($cl_age != $cl_prec)
{
// si on remplissait un fichier
if ($cl_prec)
{
// si la ligne du jour n'y a pas été recopiée
if ($ligmemo)
// le faire
fputs ($descout, $ligmemo);
// fermer le fichier qu'on vient de remplir
fclose ($descout);
}
// nouveau fichier à remplir
$csvout = "vacsi-age-".$cl_age.".csv";
$ficout = DIR_CSV."/".$csvout;
$descout = fopen ($ficout, "w");
// si l'ouverture s'est mal passée
if (! $descout)
// il pourra y avoir plusieurs erreurs du même type
message ("Problème créer le fichier ".$csvout);
// mémoriser la nouvelle classe d'âge
$cl_prec = $cl_age;
// on commencera à afficher les données début janvier 2021
$dizaine = 0;
}
// sauter le ; qui suit la classe d'âge
fgetc ($descscv);
// lire le reste de la ligne
$ligmemo = fgets ($descscv, LG_MAX_CSV);
// si on n'a encore rien enregistré pour cette dizaine de jours
if ($ligmemo [0] == $dizaine && $ligmemo [1])
{
// le faire
fputs ($descout, $ligmemo);
// cette ligne ne sera pas réutilisée
$ligmemo = "";
// passer à la dizaine de jours suivante
$dizaine = ($dizaine + 1) % 3;
}
// lire la classe d'âge de la ligne suivante
$cl_age = fgets ($descscv, 3);
}
// si la ligne du jour n'a pas été recopiée
if ($ligmemo)
// le faire
fputs ($descout, $ligmemo);
// fermer le fichier qu'on vient de remplir
fclose ($descout);
// et celui qui était ouvert en lecture
fclose ($descscv);
}
// sinon
else
// message d'erreur
$erreur = "Problème pour relire le fichier ".$csv;
}
?>