Code source du fichier testmaj-a-fra.php

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