<html> <head> <title>Phpcovid : Fichiers csv "vaccination à ce jour"</title> <meta name=author content="Bernard Chardonneau"> <meta name=copyleft content="Logiciel et données publiés dans le domaine public"> <meta name=robots content="noindex,follow"> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <link href="css/misenpage.css" rel="stylesheet" type="text/css"> <link href="css/styles.css" rel="stylesheet" type="text/css"> </head> <body> <div id="contenu"> <h1>Récupération et traitement des fichiers csv "vaccination à ce jour"</h1> Ces fichiers sont de petite taille. Ils contiennent seulement des données pour la vaccination à la dernière date disponible.<br> <br> Comme tous les fichiers csv, ils commencent par une ligne d'entête qui décrit sommairement les champs des lignes qui suivront.<br> <h2>Vérifications communes aux fichiers concernés</h2> A chaque fichier <tt>.csv</tt> qui concerne la vaccination à ce jour est associé un fichier vide de suffixe <tt>.date</tt><br> <br> L'intérêt de se fichier est son heure de dernière mise à jour.<br> On commence par la vérifier.<br> !vsource exemples-code/test-ficdate.php Si le dernier appel de la fonction de vérification date de moins de TEMPO_TESTS seconde, avec TEMPO_TESTS défini dans <tt>constantes.php</tt> !vsource exemples-code/tempo-tests.php soit moins d'une demi heure, on conserve la version du fichier <tt>.csv</tt> mémorisé localement.<br> <br> Dans le cas contraire, on commence par actualiser l'heure de dernière vérification :<br> !vsource exemples-code/maj-ficdate.php Il faut ensuite vérifier si le fichier sur le site de référence concerne une date ultérieure à celle mémorisée dans le fichier local.<br> <br> Si c'est le cas, on le mettra à jour.<br> <br> Dans le cas du fichier <tt>vacsi-tot-a-fra.csv</tt> qui mémorise les taux de vaccination pour les différentes classes d'âge, le code suivant permet de récupérer les dates à comparer :<br> !vsource exemples-code/test-dateurl.php Examinons ce code en détail.<br> <br> Tout d'abord, on ouvre en lecture le fichier du site de référence. On saute la première ligne (description des champs du fichier) dont on n'a pas besoin, et on lit la ligne suivante :<br> !vsource exemples-code/lit-date-url.php Pour récupérer la date mentionnée dans cette ligne, on peut le faire en une instruction. Il suffit de récupérer 10 caractères après le premier <tt>;</tt> récupéré dans la ligne lue :<br> !vsource exemples-code/date-url-anc.php C'est ce qui était fait au début de ce site.<br> <br> Actuellement, c'est fait d'une manière plus élégante. On sépare et on mémorise dans un tableau les différents champs de la ligne du fichier csv. La date est le 2ème champ, c'est à dire le champ numéro 1 puisqu'en informatique, on commence à compter à partir de 0.<br> !vsource exemples-code/date-url-nouv.php On ouvre alors en lecture le fichier <tt>.csv</tt> local et on récupère la date qui est mémorisée dans sa première ligne avant de refermer ce fichier.<br> !vsource exemples-code/lect-date-csv.php Si les deux dates sont différentes, ça signifie que sur le site de référence, il y a une version des données plus récente que celles mémorisée localement.<br> <br> Dans ce cas, (et dans ce cas seulement), on va mettre à jour le fichier local.<br> <br> Pour cela, on crée un nouveau fichier local de suffixe <tt>.new</tt> .<br> <br> On commence par recopier la date récupérée du site de référence qui va constituer la première ligne de ce fichier, puis on récupère le nombre de doses de vaccin prises en compte dans le fichier de référence.<br> <br> Ensuite, le traitement à effectuer est spécifique à chaque fichier <tt>.csv</tt> .<br> !vsource exemples-code/maj-csv.php Toutefois, les différents fichiers de référence concernant la vaccination à ce jour ont une structure commune. Au départ, ils ont mémorisé deux injections, puis 3, puis 4. Mais pour chaque nouvelle dose, la même logique a été utilisée pour ordonner les champs les uns par rapport aux autres.<br> <br> La première version de ce site a été mise au point pour 2 doses de vaccin. Mais peu après sa mise en ligne, une 3ème dose a été rajoutée obligeant notamment à corriger les fonctions permettant de fabriquer les fichiers csv locaux.<br> <br> Puis il y a eu la 4ème dose qui n'est pas apparue au même moment dans les fichiers de référence par classe d'âge et dans ceux ou le classement obéit à un critère géographique.<br> <br> Dans la version actuelle du site, le nombre de doses de vaccin est détecté automatiquement grâce à l'instruction suivante :<br> !vsource exemples-code/nb-doses.php L'emploi de la fonction <tt>explode (...)</tt> au moment où on a récupéré la date dans la ligne permet d'obtenir facilement le nombre de champs du fichier csv de référence, et de trouver le nombre de doses de vaccin qu'il mémorise.<br> <br> Ensuite, pour sélectionner et traiter les champs à recopier dans le fichier cvs local, la fonction présente dans <tt>selchamps-jour.php</tt> permet de faire le même traitement pour cacune des lignes de tous les fichiers de référence qui donnent l'état de la vaccination à ce jour :<br> !vsource selchamps-jour.php On remarque notamment que :<br> <ul> <li>Dans le fichier csv local, on met la population juste après le critère de sélection.</li><br> <li>Pour le champ population et pour le nombre de doses de vaccin injectées, on supprime la partie décimal du champ, car quelquefois elle existe dans le fichier de référence !</li> </ul> <br> <u>Remarque :</u> Même si la fabrication du nouveau fichier local ne prend qu'une fraction de seconde, en remplissant d'abord un autre fichier, on évite qu'un autre utilisateur qui consulterait la même page au même moment se retrouve avec aucune donnée disponible.<br> <br> <h2>Le fichier vacsi-tot-a-fra (vaccination par classe d'âge)</h2> Le fichier csv de référence a le contenu suivant :<br> <br> <iframe src="vurl-ifr.php?fich=vacsi_tot_a_fra" width="800px" height="280px"></iframe><br> <br> Afin d'effectuer le moins de traitements possible lorsqu'on affiche les taux de vaccination par classe d'âge, on veut enregistrer un fichier au format suivant :<br> !affiche ref-csv/vacsi-tot-a-fra.csv La première ligne du fichier de référence qui indique la liste des champs n'est pas conservée.<br> <br> Dans les ligne qui suivent, le premier champ qui contient "FR" (le pays) ne nous sert pas. On va donc l'ignorer aussi en sautant 3 caractères au début de chaque ligne lue :<br> !vsource exemples-code/lect-tot-a-fra.php La date extraite de la ligne qui suit est recopiée seule dans la première ligne du nouveau fichier.<br> <br> Le fichier de référence est presque trié par classes d'âge croissantes mais pas tout à fait : la classe d'âge notée 09 (de 5 à 9 ans) est positionnées entre les classes d'âge 59 et 64.<br> <br> À cause de ça, on va :<br> <ul> <li>mémoriser les données,</li> <li>les trier par classes d'âge croissantes,</li> <li>les enregistrer une fois triées.</li> </ul> D'autre part, on veut conserver en fin de fichier la ligne qui concerne le total général, toutes classe d'âge confondues.<br> <br> Les lignes concernant une classe d'âge particulière commencent par 2 chiffres qui représentent l'âge maximum dans la classe d'âge, sauf pour 80 où c'est l'âge minimum, suivies d'un <tt>;</tt> (délimiteur de champ) qui est donc en 3ème position.<br> <br> La classe d'âge correspondant au total général commence par <tt>0;</tt> (le <tt>;</tt> est en 2ème position).<br> Ce critère permet de détecter quand toutes les classes d'âge ont été mémorisées et de traiter la dernière ligne du fichier de référence séparément.<br> <br> On commence d'abord par par récupérer les champs intéressants des lignes correspondant aux différentes classes d'âge et à les mémoriser dans un tableau.<br> !vsource exemples-code/recup-cl-age.php Ensuite, on trie ces lignes par classe d'âge croissante et on copie le résultat dans un fichier.<br> !vsource exemples-code/tri-cl-age.php Pour terminer, on rajoute la dernière ligne du fichier de référence qui correspond à toutes les classes d'âge confondues.<br> !vsource exemples-code/ajout-gen.php <h2>Le fichier vacsi-tot-dep (vaccination par département)</h2> Le fichier csv de référence a la même structure que le fichier <tt>vacsi-tot-a-fra.csv</tt> et, comme lui, est presque bien ordonné, mais pas tout à fait :<br> !affiche exemples-code/extrait-vacsi-tot-dep.csv Il n'y a pas le champ "FR" en début de ligne, on n'aura dans pas à le supprimer.<br> <br> Les départements sont presque dans l'ordre mais :<br> <ul> <li>les départements 2A et 2B (anciennement un seul département numéro 20, sont entre le département 29 et le département 30,</li> <li>après le département 95, il y a les départements d'outre-mer à 3 chiffres qu'on veut ignorer (on les retrouvera dans le fichier par région).</li> </ul> On commence par mémoriser dans un tableau les informations qui nous intéressent pour les département de métropole dans l'ordre dans lequel ils apparaissent.<br> !vsource exemples-code/memlig-deptot.php Ensuite, en utilisant la possibilité d'accéder au tableau case par case (la première case à le numéro 0 et la dernière le numéro 95, soit 96 départements en tout), on va les recopier dans les fichier dans l'ordre suivant :<br> <ul> <li>départements numérotés 01 à 19,</li> <li>les départements 2A et 2B,</li> <li>départements numérotés 21 à 29,</li> <li>départements numérotés 30 à 95.</li> </ul> !vsource exemples-code/tri-deptot.php <h2>Le fichier vacsi-tot-reg (vaccination par région)</h2> Le fichier csv de référence a le contenu suivant :<br> <br> <iframe src="vurl-ifr.php?fich=vacsi_tot_reg" width="800px" height="360px"></iframe><br> <br> Il commence par des données concernant les DOM qui sont numérotés de 01 à 08 avec le 05 (Saint-Pierre-et-Miquelon) manquant.<br> <br> Ensuite, il y a les données concernant les régions de métropole avec des numéros de région compris entre 11 et 94 qui correspondent à un code INSEE.<br> <br> Toutefois, en décembre 2021 et janvier 2022, les informations concernant les DOM ont été supprimées. En conséquence, ce web site a été modifié pour afficher les informations au 30 novembre pour les DOM.<br> <br> Le script php <tt>testmaj-tot-reg.php</tt> générait à l'origine le fichier <tt>vacsi-tot-reg.csv</tt> (pour les régions de métropole) et le fichier <tt>vacsi-tot-dom.csv</tt> pour les départements d'outre-mer.<br> <br> Avec la disparition provisoire des informations sur ces derniers, j'ai simplifié ce script php pour qu'il ne traite que les régions. Un script php distinct <tt>testmaj-tot-dom.php</tt> a été rajouté le 1<sup>er</sup> février 2022 lorsque les informations sur les DOM ont été de nouveau disponibles.<br> <br> À partir du fichier csv de référence, on va créer un fichier csv local pour les régions dans lesquels les noms des régions sont exprimés en clair. Ce qui donnera ceci :<br> !affiche ref-csv/vacsi-tot-reg.csv On commence par sauter les lignes du fichier de référence concernent les DOM.<br> !vsource exemples-code/saut-dom.php Les codes pour les régions ne suivant pas l'ordre alphabétique des noms, on va mémoriser les ligne issues du fichier csv de référence dans un tableau, afin de pouvoir faire un tri alphabétique.<br> <br> Pour convertir les quelques numéros de régions qui sont compris entre 11 et 94 en nom de région, on va utiliser l'instruction switch.<br> !vsource exemples-code/memlig-regtot.php Il ne reste plus qu'à trier le tableau et à remplir le fichier avec son contenu.<br> !vsource exemples-code/remplir-regtot.php <h2>Le fichier vacsi-tot-dom (vaccination par DOM)</h2> Pour les DOM, on utilise le même fichier de référence que pour les régions. Un script spécifique permet de mettre à jour le fichier <tt>vacsi-tot-dom.csv</tt>. Ce script fonctionne presque comme celui pour les régions.<br> <br> Toutefois, comme les numéros de DOM se suivent (numérotés de 01 à 08 dans le fichier de référence), on utilise un tableau dont l'indice correspond au code du DOM pour remplacer ce code par le nom du DOM.<br> !vsource exemples-code/memlig-domtot.php <h2>Le fichier vacsi-totgen-fra</h2> Ce fichier n'est pas obtenu en récupérant sur internet un fichier de référence, mais à partir du fichier local <tt>vacsi-tot-a-fra.csv</tt> .<br> <br> En utilisant ce fichier local qui mémorise les taux de vaccination pour les différentes classes d'âge, on va calculer les taux de vaccination à partir d'un certain âge.<br> <br> Le fichier <tt>vacsi-totgen.csv</tt> est à jour si sa date de dernière modification est égale à la seconde près ou plus récente que celle du fichier <tt>vacsi-tot-a-fra.csv</tt><br> <br> Pour le vérifier, on utilise la fonction <tt>filemtime (...)</tt> et si le fichier est déjà à jour, on n'a rien à faire.<br> !vsource exemples-code/testdate-totgen.php Dans le cas contraire, on va générer un fichier de cette forme :<br> !affiche ref-csv/vacsi-totgen-fra.csv Il ressemble beaucoup au fichier <tt>vacsi-tot-a-fra.csv</tt> avec des classes d'âge en moins, mais si on regarde les valeur des 4 premiers champs (population et nombre des différentes vaccinations), on constate que ces nombres décroissent lorsqu'on passe à un âge minimal supérieur.<br> !vsource exemples-code/testdate-totgen.php Pour commencer, après avoir lu et recopié la date du fichier <tt>vacsi-tot-a-fra.csv</tt><br> !vsource exemples-code/recop-date.php on mémorise dans un tableau les autres lignes qu'il contient.<br> !vsource exemples-code/memlig-cl-age.php On peut remarquer, que pour mémoriser ces lignes, on a utilisé la fonction <tt>array_unshift (...)</tt> au lieu de <tt>array_push (...)</tt> ce qui a pour conséquence de mémoriser les informations dans l'ordre inverse, c'est à dire les classe d'âge les plus élevées d'abord.<br> <br> La dernière ligne du fichier <tt>vacsi-tot-a-fra.csv</tt> contient les informations sur la vaccination toutes classes d'âge confondues. On peut recopier directement cette ligne (qui est au début du tableau) dans le nouveau fichier.<br> !vsource exemples-code/copie-totgen.php Ensuite, après avoir initialisé des compteurs pour la population et les différentes doses de vaccination, on parcourt les différentes classes d'âge dans l'ordre où elles apparaissent (des plus âgées aux plus jeunes) en additionnant les populations et nombre de doses de vaccin.<br> <br> Pour certaines de ces classes d'âge, on calcule aussi les taux de vaccination et on mémorise toutes ces informations dans un nouveau tableau, toujours avec la fonction <tt>array_unshift (...)</tt> afin de revenir sur un ordre croissant de la liste des âges minimum.<br> !vsource exemples-code/calcul-totgenlig.php Pour finir, il ne reste plus qu'à recopier les lignes du 2ème tableau dans le fichier <tt>vacsi-totgen.csv</tt><br> !vsource exemples-code/remplir-totgen.php <br> </div> <div id="menu"> XXXMENU </div> </body> </html>