<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>