Code source du fichier testmaj-totgen-fra.php

<?php
    /*
       Vérifie si le fichier local vacsi-totgen-fra.csv est à jour
       Sinon, le reconstruit à partir du fichier vacsi-tot-a-fra.csv
       qui doit être plus ancien
    */

    function testmaj_totgen_fra ()
    {
        // fichier de référence et fichier à mettre à jour
        $csvref = "vacsi-tot-a-fra.csv";
        $csvout = "vacsi-totgen-fra.csv";

        // chemins d'accès à ces fichiers
        $ficref = DIR_CSV."/".$csvref;
        $ficout = DIR_CSV."/".$csvout;

        // si le fichier de référence n'est pas plus récent que celui à mettre à jour
        if (filemtime ($ficref) <= filemtime ($ficout))
        {
            // on n'a rien à faire
            message ("Fichier ".$csvout." déjà à jour");
            return;
        }

        // ouvrir le fichier de référence en lecture
        $descref = fopen ($ficref, "r");

        // si l'ouverture s'est bien passée
        if ($descref)
        {
            // on va reconstruire le fichier csv local à partir du fichier de référence
            message ("Mise à jour du fichier ".$csvout);

            // pour l'instant, le nom du fichier à mettre à jour est provisoire
            $nouvcsv = DIR_CSV."/vacsi-totgen-fra.new";

            // ouvrir ce fichier en écriture
            $descout = fopen ($nouvcsv, "w");

            // si l'ouverture s'est bien passée
            if ($descout)
            {
                // recopier la première ligne du fichier de référence (date)
                fputs ($descout, fgets ($descref, LG_MAX_CSV));

                // on va mémoriser les autres lignes de ce fichier dans l'ordre inverse
                $tabligne = array ();

                // lire la ligne suivante
                $ligne = fgets ($descref, LG_MAX_CSV);

                // trouver le nombre de doses mémorisées
                $args = explode (";", trim ($ligne), 20);
                $doses = (count ($args) - 2);

                // tant que non fin de fichier
                while ($ligne)
                {
                    // mémoriser la ligne lue en début de liste
                    array_unshift ($tabligne, $ligne);

                    // lire la ligne suivante
                    $ligne = fgets ($descref, LG_MAX_CSV);
                }

                // le premier élément peut directement être recopié dans le fichier à créer
                fputs ($descout, $tabligne [0]);

                // nombre d'éléments récoltés
                $nb_elem = count ($tabligne);

                // initialisation des compteurs de population
                $pop_totale = 0;

                for ($i = 0; $i < $doses; $i ++)
                    $pop_dose [$i]  = 0;

                // on va mémoriser les totaux pour plusieurs classes d'age dans un autre tableau
                $tabligtot = array ();

                // parcours de la suite des données mémorisées
                for ($j = 1; $j < $nb_elem; $j ++)
                {
                    // séparer le champs d'une ligne de données
                    $args = explode (";", $tabligne [$j], 10);

                    // âge minimal déjà mémorisé dans les totaux de population
                    $agemin = $args [0] + 1;

                    // pour certains âges minimum
                    switch ($agemin)
                    {
                        case 12 :
                        case 18 :
                        case 40 :
                        case 60 : // fabriquer une ligne du fichier résultat

                                  // classse d'âge et population totale
                                  $ligne = $agemin.";".$pop_totale;

                                  // pour chaque dose de vaccin
                                  for ($i = 0; $i < $doses; $i ++)
                                  {
                                      // nombre de doses injectées
                                      $ligne = $ligne.";".$pop_dose [$i];

                                      // calculer et rajouter les pourcentages
                                      $taux_dose [$i] = round (($pop_dose [$i]."00") / $pop_totale, 1);
                                      $ligne = $ligne."-".$taux_dose [$i];
                                  }

                                  // fin de la ligne
                                  $ligne = $ligne."\n";

                                  // rajouter la ligne au début du tableau des totaux
                                  array_unshift ($tabligtot, $ligne);

                        default : // ne rien faire pour les classes d'âge intermédiaires
                                  break;
                    }

                    // rajouter la population pour la classe d'âge à celle des classes d'âge supérieures
                    $pop_totale = $pop_totale + $args [1];

                    for ($i = 0; $i < $doses; $i ++)
                        $pop_dose [$i] = $pop_dose [$i] + $args [$i + 2];
                }

                // compléter le fichier avec les sommes de classes d'âge calculées
                foreach ($tabligtot as $ligne_csv)
                    fputs ($descout, $ligne_csv);

                // remplissage fichier terminé
                fclose ($descout);

                // on remplace l'ancien fichier par le nouveau
                rename ($nouvcsv, $ficout);
            }
            // sinon
            else
                // message d'erreur si on n'a pas pu créer le fichier
                message ("Problème pour créer le fichier ".$csvout);

            // terminé avec le fichier de référence
            fclose ($descref);
        }
        // sinon
        else
            message ("Problème pour accéder au fichier ".$csvref);
    }
?>