Code source du fichier pages-doc/trtcsvjour.html

<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&nbsp;:<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&nbsp;:<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&nbsp;:<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&nbsp;:<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&nbsp;:<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&nbsp;:<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&nbsp;:</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&nbsp;:<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&nbsp;:<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&nbsp;:<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&nbsp;: 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&nbsp;:<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&nbsp;:<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&nbsp;:<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&nbsp;:<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&nbsp;:<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&nbsp;:<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&nbsp;:<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>