Code source du fichier testmaj-regdom.php

<?php
    // création d'un fichier par région ou par DOM avec une information tous les 10 jours

    function synthese_regdom ($ficref, $type)
    {
        // ouvrir en lecture le fichier csv qu'on vient de créer
        $descscv = fopen ($ficref, "r");

        // si l'ouverture s'est bien passée
        if ($descscv)
        {
            // lire la région ou le DOM
            $regdom = fgets ($descscv, 4);

            // tant que non fin de fichier
            while ($regdom)
            {
                // si la région ou le DOM a changé par rapport à la ligne précédente
                if ($regdom != $regdom_prec)
                {
                    // si on remplissait un fichier
                    if ($regdom_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
                    $ficout = DIR_CSV."/vacsi-".$type."-".$regdom.".csv";
                    $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 ".basename ($ficout));

                    // mémoriser la nouvelle région ou le nouveau département
                    $regdom_prec = $regdom;

                    // on commencera à afficher les données début janvier 2021
                    $dizaine = 0;
                }

                // sauter le ; qui suit la région ou le DOM
                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 région ou le DOM de la ligne suivante
                $regdom = fgets ($descscv, 4);
            }

            // 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 ("Problème pour relire le fichier ".basename ($chemcsv));
    }



    /*
       Vérifie si le fichier local vacsi-reg.csv est à jour
       Si nécessaire, le reconstruit à partir du fichier de référence sur internet
       En extrait également les fichiers vacsi-reg-(..).csv et vacsi-dom-(..).csv
    */
    function testmaj_regdom ()
    {
        // fichier qui sert à déterminer si une mise à jour est utile
        $refdate = DIR_CSV."/vacsi-tot-reg.csv";

        // les 2 fichiers à mettre à jour éventuellement
        $csvdom   = "vacsi-dom.csv";
        $csvreg   = "vacsi-reg.csv";
        $chemdom  = DIR_CSV."/".$csvdom;
        $chemreg  = DIR_CSV."/".$csvreg;

        // si les fichiers sont à jour
        if (filemtime ($refdate) <= filemtime ($chemdom))
        {
            // on n'a rien à faire
            message ("Fichiers ".$csvreg." et ".$csvdom." supposés à jour");
            return;
        }

        // url du fichier de référence
        $url = SITE_REF.vacsi_reg;

        // 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);

            // les 2 fichiers à mettre à jour éventuellement
            $nouvcsv1 = DIR_CSV."/vacsi-dom.new";
            $nouvcsv2 = DIR_CSV."/vacsi-reg.new";

            // ouvrir en écriture les fichier à créer ou à actualiser
            $descscv1 = fopen ($nouvcsv1, "w");
            $descscv2 = fopen ($nouvcsv2, "w");

            // si les ouvertures se sont bien passées
            if ($descscv1 && $descscv2)
            {
                // code des DOM dans l'ordre de leur numéro du fichier csv de référence
                $liste_codedom = array ("", "gua", "mar", "guy", "reu", "smi", "may", "sba", "sma");

                // lire la première ligne de l'url
                $ligne_url = fgets ($descurl, LG_MAX_CSV);

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

                // récupérer le numéro de DOM correspondant
                $numdom = $ligne_url [1];

                // tant que la dernière ligne lue fait référence à un DOM
                while ($ligne_url [0] == "0")
                {
                    // on va réordonner le champ date et supprimer les champs inutiles
                    $ligne_url = selchamps_evol ($ligne_url, $doses);

                    // si on est passé à un autre département d'outre-mer
                    if ($numdom != $domprec)
                    {
                        // récupérer son code
                        $codedom = $liste_codedom [$numdom];

                        // et mémoriser le numéro de DOM courant
                        $domprec = $numdom;
                    }

                    // mettre en forme la ligne
                    $ligne_url = $codedom.substr ($ligne_url, 2);

                    // recopier la ligne dans le bon fichier
                    fputs ($descscv1, $ligne_url);

                    // lire la ligne suivante de l'url
                    $ligne_url = fgets ($descurl, LG_MAX_CSV);

                    // récupérer le numéro de DOM (si on n'est pas passé aux régions)
                    $numdom = $ligne_url [1];
                }

                // remplissage du fichier des DOM terminé
                fclose ($descscv1);

                // on va faire de même pour les régions

                // tant que non fin de fichier csv
                while ($ligne_url)
                {
                    // on va réordonner le champ date et supprimer les champs inutiles
                    $ligne_url = selchamps_evol ($ligne_url, $doses);

                    // récupérer le numéro de la région
                    $numreg = substr ($ligne_url, 0, 2);

                    // si on est passé à une autre région
                    if ($numreg != $regprec)
                    {
                        // récupérer son code
                        switch ($numreg)
                        {
                            case 11: $codereg = "ile";
                                     break;

                            case 24: $codereg = "cen";
                                     break;

                            case 27: $codereg = "bou";
                                     break;

                            case 28: $codereg = "nor";
                                     break;

                            case 32: $codereg = "hau";
                                     break;

                            case 44: $codereg = "gra";
                                     break;

                            case 52: $codereg = "pay";
                                     break;

                            case 53: $codereg = "bre";
                                     break;

                            case 75: $codereg = "nou";
                                     break;

                            case 76: $codereg = "occ";
                                     break;

                            case 84: $codereg = "auv";
                                     break;

                            case 93: $codereg = "pro";
                                     break;

                            case 94: $codereg = "cor";
                                     break;

                            default: $codereg = "???";
                        }

                        // et mémoriser le numéro de région courant
                        $regprec = $numreg;
                    }

                    // mettre en forme la ligne
                    $ligne_url = $codereg.substr ($ligne_url, 2);

                    // recopier la ligne dans le dernier fichier
                    fputs ($descscv2, $ligne_url);

                    // lire la ligne suivante de l'url
                    $ligne_url = fgets ($descurl, LG_MAX_CSV);
                }

                // remplissage du fichier des régions terminé
                fclose ($descscv2);

                // on remplace les anciens fichier csv par les nouveaux
                rename ($nouvcsv1, $chemdom);
                rename ($nouvcsv2, $chemreg);
            }
            // sinon
            else
                // message d'erreur si on n'a pas pu créer le fichier
                $erreur = "Problème pour créer le fichier ".$csvreg." ou ".$csvdom;

            // terminé avec l'url
            fclose ($descurl);
        }
        // sinon autre message d'erreur
        else
            $erreur = "Problème d'accés à l'URL pour mettre à jour les fichiers ".$csvreg." et ".$csvdom;

        // si pas d'erreur durant cette première partie
        if (! $erreur)
        {
            // 2ème partie : on crée un fichier par région et un fichier par DOM
            //               avec une information tous les 10 jours
            synthese_regdom ($csvreg, "reg");
            synthese_regdom ($csvdom, "dom");
        }
        // sinon
        else
            // afficher l'erreur trouvée
            message ($erreur);
    }
?>