<?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; } ?>