Récupération de la liste des codes postaux français

18/01/06 à 19:45 :: Yannick Torrès
Catégorie : php

14/07/10 à 01:31
Mise à jour du script afin de supprimer les caractères aléatoires injectés dans le source des pages de la Poste.
Maintenant, il est composé de 36909 entrées.
Merci à Thierry pour son commentaire instructif [clin d'oeil]

21/01/10 à 23:36
Mise à jour du script suite aux modifications de la page de la Poste.
Avant cette modification, le fichier résultat était composé de 36 633 entrées.
Maintenant, il est composé de 36 804 entrées.
Merci à Laurent de m'avoir prévenu par email de ces changements.

23/01/09 à 18:54
Mise à jour du script suite aux modifications de la page de la Poste. Merci à Jean-Christophe de m'avoir prévenu par email de ces changements.

28/06/08 à 20:30
Quelques modifications du script et mise à jour de la liste des codes issus du script.

18/01/06 à 19:45
Voilà longtemps que je voulais vous faire partager ce petit script mais par manque de temps, il n'arrive que maintenant.

La problèmatique est simple :

Lorsque l'on développe certaines applications en interne pour le boulot, il arrive un moment (ou pas) où l'on a besoin de la liste des codes postaux français.
Et là, on cherche, on cherche encore et... on ne trouve pas ! (peut-être n'a t-on pas cherché au bon endroit d'ailleurs...)

La solution :

Écrire un script qui va chercher les codes postaux pour nous.
La source ? La Poste bien thûr !

Il suffit donc d'aller sur cette page et de récupérer un à un les codes postaux, par copier / coller....

ou alors, faire un script qui le fait pour nous [sourire]

Le principe est simple : on ouvre un socket sur la page, on parse le résultat et on passe à une valeur suivante.

Je vous fournis donc ici le script Php qui m'a permis d'arriver à mes fins et ici, le fichier résultat.

Je ne sais pas si j'ai légalement le droit d'avoir fait cela, je ne sais pas si j'ai le droit de diffuser la solution pour le refaire.

Mais si ca peut servir à d'autres personnes, ce sera déjà bien [clin d'oeil]

PS : Le fichier résultant contient plusieurs entrées ayant un code postal et une commune identique et c'est normal. Personnellement, j'ai exploité ce fichier via une base MySQL, ce qui permet d'éliminer les doublons d'une manière simple et rapide.

Commentaires

  • Dommage...
    Zola2 [@], le 19/01/06 à 21:56 :: Répondre

    Beaucoup de temps perdu... suffit d'aller sur le site de l'INSEE y a tous les fichiers : codes postaux, villes, pays, catégories socio professionnelles, etc

    • ?!
      Yannick Torrès, le 19/01/06 à 22:09 :: Répondre

      Justement, j'ai parcouru le site de l'INSEE à la recherche de ces fichiers... et je n'ai rien trouvé.
      Tu as des liens ?

      • Encore mieux
        Zola2 [@], le 23/01/06 à 13:05 :: Répondre

        J'ai mieux :

        http://www.galichon.com/codesgeo/

        Tu y trouveras les fichiers des codes postaux, villes, coordonnées, population...

        • Encore mieux
          Yannick Torrès, le 23/01/06 à 18:33 :: Répondre

          Je veux pas paraitre rabajoie mais est-ce fiable ?
          Ce qui me plait dans ce que j'ai écris, c'est surtout que les données sont fiables parce que venant de La Poste. Donc, on peut les utiliser les yeux fermés sans se demander s'il n'y a pas une faute de frappe, une erreur quelconque, etc.

          Et là, non seulement je donne le fichier résultat mais aussi la manière de le réaliser soi-même. Du coup, ca enlève tous les doutes posés par mes premières remarques.

        • Re : Encore mieux
          georges [@], le 09/03/07 à 18:09 :: Répondre

          super l'astuce , merci pour l'info

    • bravo
      frantz [@], le 16/10/06 à 15:30 :: Répondre

      Bel exercice pratique de PhP et même si le résultat peut s'obtenir autrement c'est un bel exemple d'utilisation astucieuse d'internet.

  • Problème ..
    site David [@], le 01/04/06 à 10:50 :: Répondre

    J'ai l'impression que tu as enlevé trop de doublons ...
    exemple 90200 correspond à plusieurs communes , 8 exactement ( d'après le site de la poste ), et on ne les voit plus ces communes dans ton fichier résultat :-//


    ( en fait je cherchais la liste exhaustive de toutes les communes de France )

    Si tu peux juste changer ce point [clin d'oeil]

    Amicalement,
    David

    • exemple
      site David [@], le 01/04/06 à 10:58 :: Répondre

      Par exemple on ne voit pas Gyromagny en 90200..

      Cela dit bon travail !

      • en fait...
        site David [@], le 01/04/06 à 11:01 :: Répondre

        ...pour un code postal, tu aurais pu afficher les listes des communes les unes à la lsuite des autres, ce qui permettait avec moins de lignes d'avoir des résultats encore plus complets par exemple [sourire]

        • en fait...
          Yannick Torrès, le 01/04/06 à 14:23 :: Répondre

          Je me sers de ce script tous les jours au boulot et perso, je me suis aperçu qu'il manquait Neuville les dieppe dans mon résultat...

          Je vais refaire un tour sur le script avec le manque que j'ai trouvé ainsi que les tiens.
          On devrait arriver à quelque chose de bien complet [clin d'oeil]

          Merci pour le retour

      • Et si !
        Yannick Torrès, le 12/04/06 à 12:37 :: Répondre

        Je suis en train de revérifier le script et....

        Les 8 communes correspondant au code postal 90200 sont bien présentes dans le fichier résultat [sourire]

        Par contre, il reste le souci que j'avais identifié pour Neuville les dieppe...

        • une BD acces
          kopeto [@], le 13/12/06 à 18:31 :: Répondre

          Je suis juste de passage. Voici un autre fichier (BD acces)
          http://officesystem.access.free.fr/ex_codes_postaux.htm
          38646 communes (donc un peu moins que toi) mais avec Neuville les dieppe
          @+

        • Re : Et si !
          pichon, le 31/01/07 à 11:01 :: Répondre

          Je sais pas l'intérêt de passer par une base de données => un tri sur un fichier plat aurait suffit

  • bravo
    straff, le 05/10/06 à 17:40 :: Répondre

    génial comme idée et mise en pratique
    merci

  • Récupération de la liste des codes postaux français
    Terence, le 03/01/07 à 14:52 :: Répondre

    Un grand grand merci pour ce script qui m'aide enormément!!!!!

  • Récupération de la liste des codes postaux français
    site Vaf, le 29/08/07 à 11:57 :: Répondre

    Déjà eu l'occasion de récupérer des données par le même principe.
    Et ca me fait toujours bien rire...
    Bien joué!

  • Récupération de la liste des codes postaux français
    site Philippe [@], le 31/10/07 à 18:40 :: Répondre

    Yannick,

    Merci pour tous ces codes, c'est sympa. J'ai vu d'autres sites, mais c'est la cata!
    Par contre comment faire pour inclure devant des mots pour chaque code postal (par que je suis pas bon en informatique)!!!
    Merci de ton aide, mon numéro est sur le site; bonne navigation.
    J'attends de vos nouvelles.

  • Récupération de la liste des codes postaux français
    mayeur [@], le 07/01/08 à 19:52 :: Répondre

    "Le principe est simple : on ouvre un socket sur la page, on parse le résultat et on passe à une valeur suivante."

    Hum, n'étant pas un spécialiste du langage php, j'avoue que cette explication me laisse sans voix !

    Que faut il faire ?

    • Re : Récupération de la liste des codes postaux français
      Yannick Torrès, le 08/01/08 à 00:37 :: Répondre

      B'soir Mayeur,

      Tu as à dispo le script Php et le fichier résultat.

      Inutile donc de comprendre [clin d'oeil] Soit tu récupères le fichier php, tu le sauvegardes et tu le lances pour récupérer le résultat, soit tu récupères directement le fichier résultat.
      Les liens vers ces 2 fichiers sont dans le billet.

      Bon courage [sourire]

      • Re : Récupération de la liste des codes postaux français
        MademoiselleC [@], le 27/11/08 à 13:02 :: Répondre

        Pas une as de l'info non plus...
        Comment fait-on pour lancer un fichier php, quel programme faut-il utiliser?
        Et au final quel est le script php le plus fiable (doublons...)?
        Merci pour ce post qui est vraiment tres utile!

        • Re : Récupération de la liste des codes postaux français
          Yannick Torrès, le 27/11/08 à 19:15 :: Répondre

          Bonjour,

          Pour lancer le script Php, il faut un interpréteur Php. Voir le site http://php.net pour plus d'informations.

          Concernant les doublons, comme je le dis en bas du billet, c'est normal. Il suffit de l'exploiter via une base de données MySql.

          Maintenant, sachant que ce script commence à prendre de l'age, il se peut que la page du site de laposte est changé. Dans un tel cas, il faudrait le modifier afin de refléter ces changements...

  • Récupération de la liste des codes postaux français
    Claire, le 19/01/08 à 21:45 :: Répondre

    merci. Tu viens de m'enlever une belle épine du pied. J'avais justement un joli bug dans mon application du au fait que je n'avais pas a disposition les codes postaux.

  • J'ai mieux!!
    Fred [@], le 30/01/08 à 09:57 :: Répondre

    Salut..Pas mal ton fichier mais completement incomplet..va a la poste et achete plutot le livre "CODE POSTAL"..il coute 1.50euros et plus complet..il te manque trop de ville.La mienne Pour commencé!

    • Re : J'ai mieux!!
      Jean-Marc, le 30/01/08 à 16:52 :: Répondre

      T'es gentil Fred mais offre le plutot à ta grand-mère s'il elle s'ennuie elle pourra toujours le recopier dans un fichier à la mano ...
      Comment tu veux qu'on puisse exploiter informatiquement parlant un bouquin ??? Gros malin va ! [clin d'oeil]

      C'est pas mon genre de poster sur un forum quand c'est pas pour faire avancer les choses, mais là je n'ai pu me retenir de te faire savoir que ça serait pas mal que tu fasses pareil ! Et promis, si j'ai un truc béton, je monte le WebService qui va avec et je vous reposterais le l'URL, histoire d'avoir été contructif ...

      Merci aux autres en tout cas [clin d'oeil]

      Jm

  • Récupération de la liste des codes postaux français
    site Ludo [@], le 06/02/08 à 16:21 :: Répondre

    Salut,

    Bien pratique ce petit script. Je l'ai remanié à ma sauce pour le rendre plus robuste et plus concis. Si ça peut servir à quelqu'un le voici :

    <?PHP
    function httpPost($host,$path,$query){
    $handle=fsockopen($host,80);
    fwrite($handle,"POST $path HTTP/1.1\r\nHost: $host\r\nContent-type: application/x-www-form-urlencoded\r\nUser-Agent: Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)\r\nContent-length: ".strlen($query)."\r\nConnection: close\r\n\r\n".$query);
    $result='';
    if($handle!==false){
    while(!feof($handle)){
    $result.=fread($handle,4096);
    }
    fclose($handle);
    }
    return $result;
    }

    for($i=10;$i<999;$i++){
    $result=httpPost(
    'www.laposte.fr',
    '/sna/rubrique.php3',
    'id_rubrique=59&recalcul=oui&selCritere=CP&txtCP='.str_pad($i,3,'0',STR_PAD_LEFT)
    );
    preg_match_all("'<TD class=\"resultat\">[cri][0-9a-zA-Z&; -]*?)<\/TD>'",$result,$out,PREG_PATTERN_ORDER);

    for($j=0;$j<count($out[1]);$j++){
    $data=trim(ereg_replace('[^0-9A-Z]+',' ',html_entity_decode($out[1][$j],ENT_COMPAT,'UTF-8')));
    list($zipCode,$city)=explode(' ',$data,2);
    print("$zipCode : $city<br/>"[clin d'oeil];
    }
    }
    ?>

    Ludo.

    • Re : Récupération de la liste des codes postaux français
      site Ludo [@], le 06/02/08 à 16:27 :: Répondre

      Autre version avec déboulonnage :

      function httpPost($host,$path,$query){
      $handle=fsockopen($host,80);
      fwrite($handle,"POST $path HTTP/1.1\r\nHost: $host\r\nContent-type: application/x-www-form-urlencoded\r\nUser-Agent: Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)\r\nContent-length: ".strlen($query)."\r\nConnection: close\r\n\r\n".$query);
      $result='';
      if($handle!==false){
      while(!feof($handle)){
      $result.=fread($handle,4096);
      }
      fclose($handle);
      }
      return $result;
      }

      $data=array();
      for($i=10;$i<20;$i++){
      $result=httpPost(
      'www.laposte.fr',
      '/sna/rubrique.php3',
      'id_rubrique=59&recalcul=oui&selCritere=CP&txtCP='.str_pad($i,3,'0',STR_PAD_LEFT)
      );
      preg_match_all("'<TD class=\"resultat\">[cri][0-9a-zA-Z&; -]*?)<\/TD>'",$result,$out,PREG_PATTERN_ORDER);

      for($j=0;$j<count($out[1]);$j++){
      $data[]=trim(ereg_replace('[^0-9A-Z]+',' ',html_entity_decode($out[1][$j],ENT_COMPAT,'UTF-8')));
      }
      }

      $data=array_unique($data);
      foreach($data as $item){
      list($zipCode,$city)=explode(' ',$item,2);
      print("$zipCode : $city<br/>"[clin d'oeil];
      }

      • Re : Récupération de la liste des codes postaux français
        Matthieu [@], le 13/05/08 à 12:30 :: Répondre

        Bonjour à tous.
        Mon navigateur n'interprète pas correctement deux lignes du listing, j'ai deux émoticônes à la place de certains caractères.
        La première ligne:
        Après ceci preg_match_all("'<TD class=\"resultat\">
        et avant ceci [0-9a-zA-Z&; -]*?)<\/TD>'",$result,$out,PREG_PATTERN_ORDER);

        Ensuite la deuxième ligne qui se trouve à la fin:
        Après ceci print("$zipCode : $city<br/>"
        et avant ceci ;
        }

        Merci de me donner les caractères manquants.
        Cordialement
        Matthieu

      • Re : Récupération de la liste des codes postaux français
        Matthieu [@], le 13/05/08 à 13:04 :: Répondre

        Re-bonjour, je pense que les caractères qui manque dans chaque ligne sont les suivants ( pour la première ligne et ) pour la deuxième ligne. Cependant rien ne fonctionne quand même. Serait-il possible de reçevoir le fichier dans ma BAL? Merci d'avance
        zorba@orinfor.com

        • Re : Récupération de la liste des codes postaux français
          site Ludo [@], le 24/05/08 à 10:35 :: Répondre

          Bonjour !

          Je viens de mettre le code source en ligne : http://www.ludosoft.fr/data/codepostaux.php5.txt

          Enjoy [clin d'oeil]

  • Récupération de la liste des codes postaux français
    savannah [@], le 15/07/08 à 00:15 :: Répondre

    message pour Yannick Torrès : si tu passes sur le forum, ton code comme il est, super, cela m'a bien arranger.

    je profite pour ajouter la manière (selon moi) de remplir en même temps une base mysql.
    créer une table code_postaux par exemple dans votre base mysql (déjà créé[clin d'oeil] avec un ID, codepostal, ville.
    dans le script de Yannick , au début du php créer votre lien de connection à votre base par un include, vers la fin du script , dans la condition else,
    placer un explode : list($Codep,$Ville)=explode(' ',$tmp,2); (les variables doivent correspondre au champs de votre table code_postaux. Créer une requete d'insertion de données à votre table : $requete = "INSERT INTO code_postaux (codep, ville) VALUES ($codep, $ville)";
    exécuter la requete : mysql_query($requete,$votrevariabledeconnection);
    et pour finir, enregistrer votre fichier script et lancer. avec une bonne connexion le remplissage prendra ps trop de temps.

    Merci encore Yannick

  • Manque les communes Paris, Lyon, Marseille...
    Paradox [@], le 26/01/09 à 14:22 :: Répondre

    Bonjour,

    Il semble que le site de la poste demande le nom de la rue pour avoir le CP de Paris, Lyon, Marseille. Le script ne fonctionne donc pas pour les CP en 75 par exemple. Je n'ai pas eu le temps de vérifier si d'autres cas particuliers existent mais cela nous conduit à avoir une liste incomplète. Bonne idée le coup de PHP mais elle a ses limites. [déçu]

  • Récupération de la liste des codes postaux français
    Tof, le 12/02/10 à 11:58 :: Répondre

    MERCI A TOUS. C'est exactement ce que je cherchais (depuis un bon moment d'ailleurs).
    C'est vraiment vraiment topissime votre travail !!!
    merci !

    • Re : Récupération de la liste des codes postaux français
      tof, le 12/02/10 à 12:00 :: Répondre

      C'est juste dommage qu'il n'y ai pas un version minuscule avec accent...
      mais bon, c'est déjà tellement cool [sourire]

  • Récupération de la liste des codes postaux français
    JeanHenri79 [@], le 16/02/10 à 07:11 :: Répondre

    Bravo pour le travail. N'ayant pas de Php sous la main, j'ai entrepris de faire le même travail en script Bash, et une fois le travail fait, j'ai comparé nos 2 fichiers : j'arrive à 37182 codes postaux (au 15 février).
    - Tu sembles laissé de côté plusieurs communes,
    - Il y a aussi des lignes mal formées (code postal seul ou 2 communes sur la même ligne sans code postal)
    - Il y a enfin des communes qui contiennent des caractères en trop (en hexadécimal ?)

    J'ai regardé ton script, mais je ne suis pas assez bon en php pour trouver le problème.Quand tu enlèves les 5a8, cela doit correspondre aux caractères unicode représentant les é. De mon côté, j'utilise la commande iconv pour transformer le fichier utf-8 en encodage latin1.

    Si tu le souhaites je peux te fournir le résultat de la commande DIFF sur nos 2 fichiers pour que tu aies la liste complète des différences et je tiens à la disposition de tous mes script bash.

    Merci encore pour ton travail.

    • Re : Récupération de la liste des codes postaux français
      site Juan [@], le 26/02/10 à 17:43 :: Répondre

      Salut,

      Ouai moi je suis en effet interessé je cherche pour mon site une BDD (base de données) comportant toutes les villes de france (par code postale) en effet l'utilisateur entre son code postale et la ville s'affiche automatiquement le problème c 'est qu'en ce moment il me manque des code postales par exemple pour Lyon je dois rentrer 69000 mais 69001 69002... ne fonctionneront pas !!

      Le site vous souhaitez le voir est ici (c'est un site de dons d'objet en ligne) : http://faites-vos-dons.fr/donner.php

      Je cherche donc une base plus complète.

      Ca serait donc cool si tu pouvais en effet faire passer ton fichier bien garni [sourire]

      Le plus cool ca serait que le fichier soit direct en sql (ou si quelqu'un dispose de cela..)

      Sinon je pensais faire un petit programme qui trouvait le CP le plus proche de celui rentré mais ca va me prendre encore pas mal de temps. Merci

      ++

      • Re : Récupération de la liste des codes postaux français
        JeanHenri79 [@], le 06/04/10 à 14:18 :: Répondre

        Voilà le script Bash réalisant le travail (téléchargeable sur Script de récupération des Codes Postaux français) :

        #!/bin/bash

        # Script : recupCP
        # Rôle : récupère les codes postaux disponibles à l'URL
        # http://www.laposte.fr/sna/rubrique.php3?id_rubrique=59
        # Dépendances : curl, grep, iconv, sed, sort

        # Auteur : Jean Henri
        # Date : 16 février 2010
        # Mel : henrij@saintjo.org

        # Commentaires :
        # Ce script se découpe en 3 parties qui s'enchainent
        # mais peuvent être étudiées séparément
        # étape 1 : récupération des pages HTML
        # étape 2 : extraction des informations brutes dans les fichiers téléchargés
        # et création d'un unique fichier
        # étape 3 : suppression des informations inutiles
        # et création d'un fichier final au format CSV
        #
        # L'étape 1 est l'étape qui prend le plus de temps : 2h30 (ADSL 2Mbps)
        # L'étape 2 est réalisée en moins de 30 secondes
        # L'étape 3 prend un peu plus d'une minute
        #
        # Ce script crée un répertoire nommé "res" pour stocker les fichiers
        # téléchargés et utilise un certain nombre de fichier temporaires pour les
        # différents traitements. Je vous conseille donc de l'exécuter dans un
        # répertoire spécifique afin qu'il n'y ait pas de conflit avec vos propres
        # fichiers.
        # Un fichier log est créé pour avoir le détail des opérations effectuées
        # Les fichiers téléchargés ne sont pas effacés à la fin du script (31 Mo)

        # répertoire où seront stockés les fichiers HTML
        REP_TEMP="./res/"
        # extension des fichiers HTML récupérés
        EXT_HTML=".html"

        # fichier journal utilisé
        FICHIER_LOG="recup.log"

        # fichiers temporaires (ils seront supprimés à la fin du script)
        FICHIER1="recup.001"
        FICHIER2="recup.002"
        FICHIER3="recup.003"
        FICHIER4="recup.004"
        FICHIER5="recup.005"
        FICHIER6="recup.006"
        FICHIER7="recup.007"
        FICHIER8="recup.008"

        # fichier final, au format CSV (valeurs séparées par des points-virgule)
        # champ 1 : code postal
        # champ 2 : ville
        # champ 3 : champ facultatif, si il existe il vaut 1 pour indiquer que
        # pour cette ville le code postal dépend de la rue
        # le nom du fichier est de la forme cp_AAAA_MM_JJ-HHhMMmSSs.csv
        # en utilisant la date et heure système au début du script
        FICHIER_CSV="cp_`date +%Y_%m_%d-%Hh%Mm%Ss`.csv"

        #
        # ETAPE 1 : on télécharge tous les fichiers HTML des codes postaux
        #
        DATEDEB=`date`
        echo "" >> $FICHIER_LOG
        echo "Début de téléchargement des codes postaux : $DATEDEB" >> $FICHIER_LOG

        echo -n "Etape 1 : "

        # On va réaliser plusieurs fois l'opération de téléchargement
        # afin d'élimininer les fichier incomplets
        BOUCLE=true
        while $BOUCLE
        do
        # à priori on suppose qu'on ne bouclera pas une autre fois...
        BOUCLE=false
        echo -n "|"

        # on utilise un répertoire temporaire nommé res
        if [[ ! -d $REP_TEMP ]]
        then
        mkdir $REP_TEMP
        fi

        # on veut récupérer tous les départements, y compris DOM-TOM
        for DEP in `seq 10 999`
        do
        # on ajoute un zéro pour les nombres inférieurs à 100
        if [[ $DEP -lt 100 ]]
        then
        DEPT="0$DEP"
        else
        DEPT=$DEP
        fi

        # si le fichier a déjà été téléchargé,
        if [[ -f ${REP_TEMP}${DEPT}${EXT_HTML} ]]
        then
        # alors on vérifie qu'il est complet
        LIGNE=`tail --lines=1 ${REP_TEMP}${DEPT}${EXT_HTML}`

        # si la dernière ligne du fichier est la fin du html
        if [[ "$LIGNE" == "</html>" ]]
        then
        # alors le fichier est complet, et on le ne télécharge pas à nouveau
        RECUP=false
        else
        # sinon on veut le télécharger
        RECUP=true
        fi
        else
        # sinon on veut le télécharger
        RECUP=true
        fi

        # si on veut télécharger le fichier
        if $RECUP
        then
        # on le fait !
        echo "Récupération de $DEPT.html" >> $FICHIER_LOG
        curl -s -o ${REP_TEMP}${DEPT}${EXT_HTML} \
        -d txtCP=$DEPT -d selCritere=CP \
        http://www.laposte.fr/sna/rubrique.php3?id_rubrique=59&recalcul=oui

        # il faudra donc reboucler pour l'opération de téléchargement,
        # dès fois qu'il y aurait un problème.
        BOUCLE=true
        fi
        done

        # ATTENTION ! curl travaille en tâche de fond donc quand la boucle ci-dessus
        # se termine les téléchargements continuent... un certain temps !

        # on va afficher un point à l'écran toutes les 100 boucles
        COMPTEUR=0
        # est-ce que curl est dans la liste des processus ?
        TEST=`ps | grep "curl" | tail --lines=1`
        # tant que curl fonctionne
        while [[ $TEST != "" ]]
        do
        # si on a bouclé 100 fois
        if [[ $COMPTEUR -ge 100 ]]
        then
        # alors on affiche un point
        echo -n "."
        # et on remet le compteur à 0
        COMPTEUR=0
        else
        # sinon on ajoute 1 au compteur
        COMPTEUR=$(( $COMPTEUR + 1 ))
        fi

        # est-ce que curl est toujours dans la liste des processus ?
        TEST=`ps | grep "curl" | tail --lines=1`
        done
        # ca y est curl a fini de tourner !

        # Cela termine le TANT QUE contrôlé par la variable BOUCLE
        done

        # on est maintenant sûr que tous les fichiers ont été téléchargés correctement
        echo ""

        DATEFIN=`date`
        echo "Fin de téléchargement des codes postaux : $DATEFIN" >> $FICHIER_LOG
        echo "" >> $FICHIER_LOG

        #
        # ETAPE 2 : on extrait toutes les lignes contenant des codes postaux
        # et on les place dans un seul fichier
        #
        DATEDEB=`date`
        echo "" >> $FICHIER_LOG
        echo "Début d'extraction des codes postaux : $DATEDEB" >> $FICHIER_LOG
        echo " -> fichiers 010 à 999" >> $FICHIER_LOG

        echo -n "Etape 2 : "

        # si le fichier résultat existe déjà, on le supprime
        if [[ -f ${FICHIER1} ]]
        then
        rm ${FICHIER1}
        fi

        # on récupère tous les départements
        for DEP in `seq 10 999`
        do
        # si le numéro est inférieur à 100, on ajoute un zéro devant
        if [[ $DEP -lt 100 ]]
        then
        DEPT="0$DEP"
        else
        DEPT=$DEP
        fi

        # un affichage pour faire patienter...
        echo -n "$DEPT "

        # si le fichier a été récupéré
        if [[ -f ${REP_TEMP}${DEPT}${EXT_HTML} ]]
        then
        # alors on extrait les lignes contenant des codes postaux
        cat ${REP_TEMP}${DEPT}${EXT_HTML} | grep "<div align='center'>" \
        >> ${FICHIER1}
        else
        # sinon on le signale absent
        echo " Fichier ${DEPT}${EXT_HTML} absent" >> $FICHIER_LOG
        fi
        done

        echo ""

        DATEFIN=`date`
        echo "Fin d'extraction des codes postaux : $DATEFIN" >> $FICHIER_LOG
        echo "" >> $FICHIER_LOG

        #
        # ETAPE 3 : on fait le ménage dans les lignes récupérées
        # et on fabrique un fichier sans doublon au format CSV !
        #
        DATEDEB=`date`
        echo "" >> $FICHIER_LOG
        echo "Début de nettoyage des codes postaux : $DATEDEB" >> $FICHIER_LOG

        echo -n "Etape 3 : "

        # on convertit en latin1 pour éviter les problèmes d'accent avec sed
        iconv -t utf-8 -f latin1 ${FICHIER1} > ${FICHIER2}

        # on coupe les lignes avant toute fermeture de balise </div>
        sed -e "s/<\/div>/\n<\/div>/g" ${FICHIER2} > ${FICHIER3}
        # maintenant, on recherche les balises ouvrantes <div align='center'>
        # et on remplace par un retour à la ligne
        sed -e "s/^.*<div align='center'>/\n/" ${FICHIER3} > ${FICHIER4}
        # on supprime toutes les lignes vides
        sed "/^$/d" ${FICHIER4} > ${FICHIER5}
        # on supprime toutes les lignes qui commencent par </div>
        sed "/^<\/div>/d" ${FICHIER5} > ${FICHIER6}
        # on s'occupe des villes dont le code postal dépend de la rue,
        # ce qui sera signalé par un 3ème champ valant 1
        sed -e "s/&nbsp;.*$/;1/" ${FICHIER6} > ${FICHIER7}

        # Normalement, chaque ligne contient soit un code postal, soit une ville
        # Il faut donc relier les 2, MAIS ATTENTION :
        # certaines villes ont plusieurs codes postaux,
        # il faut donc faire un traitement spécifique?

        if [[ -f ${FICHIER8} ]]
        then
        rm ${FICHIER8}
        fi

        #index <-- 0
        INDEX=0
        #Ce compteur sert à la barre de progression
        COMPTEUR=0
        echo -n "."

        #pour chaque ligne du fichier faire
        while read LIGNE
        do
        # on affiche un . toutes les 500 lignes
        if [[ $COMPTEUR -ge 500 ]]
        then
        echo -n "."
        COMPTEUR=0
        else
        COMPTEUR=$(( $COMPTEUR + 1 ))
        fi

        # si la ligne contient un entier (formée de 5 chiffres)
        if [[ "$LIGNE" == [0-9][0-9][0-9][0-9][0-9] ]]
        then
        # numeros[index] <-- ligne
        NUMERO[$INDEX]=$LIGNE
        # index <-- index + 1
        INDEX=$(( $INDEX + 1 ))
        # sinon
        else
        # pour indexLigne <-- 0 à index-1 faire
        for INDEXLIGNE in `seq 0 $(( $INDEX - 1 ))`
        do
        # ecrire numero[index];ligne
        echo "${NUMERO[$INDEXLIGNE]};$LIGNE" >> ${FICHIER8}
        # fin pour
        done
        # index <-- 0
        INDEX=0
        # fin si
        fi
        done < ${FICHIER7}
        #fin pour

        # on trie le fichier en éliminant les doublons
        sort -u < ${FICHIER8} > ${FICHIER_CSV}

        # on supprime tous les fichiers intermédiaires
        # vous pouvez commenter ces 2 lignes pour en étudier le contenu
        rm ${FICHIER1} ${FICHIER2} ${FICHIER3} ${FICHIER4}
        rm ${FICHIER5} ${FICHIER6} ${FICHIER7} ${FICHIER8}

        echo ""

        DATEFIN=`date`
        echo "Fin de nettoyage des codes postaux : $DATEFIN" >> $FICHIER_LOG
        echo "" >> $FICHIER_LOG

        #
        # Fin du script recupCP
        #

  • Récupération de la liste des codes postaux français
    loriot [@], le 05/03/10 à 21:22 :: Répondre

    Petite question quant fait un copier coller de la liste des codes postaux français dans un fichier de type j'ai dans les memes cellules le code et le nom de la ville correspondant.
    Petit astuce pour avoir dans deux cellules différentes un le code deux le nom de la ville.
    Merci

  • Récupération de la liste des codes postaux français
    GuB, le 16/06/10 à 17:12 :: Répondre

    Ce fichier est meilleur que celui de galichon.com.
    Par exemple Aix-en-Provence a pour codes 13090 et 13100 selon la rue. galichon.com ne donne que 13090.
    Alors merci [clin d'oeil]

    Il y a cependant quelques bugs dans le fichier final concernant LIERES, LIETTRES, MILHAS, MIREMONT, PLAISANCE, POLASTRON, PONTGOUIN, POUPRY, RIBEYRET, ROCHEBRUNE, ST EULIEN, ST THIEBAULT, TANZAC-THAIRE du style :
    62190-LIETTRES
    LIERES-LIETTRES
    62145-LIETTRES
    au lieu de :
    62190-LIERES
    62145-LIETTRES
    Et un : "a1431800-VILLENEUVE DE RIVIERE" au lieu de "31800-VILLENEUVE DE RIVIERE" (que fait ce "a14" ?)

    A noter que je n'ai pas testé le script, juste le fichier final.

    Par contre voici un "one liner" fait en perl qui j'ai utiliser pour corriger vite fait le fichier et enlever les doublons. Je ne sais pas si ca interessera grand monde tellement c'est moche mais voila quand même :
    while (<>[clin d'oeil] { chomp; if (/(\d{5})-(.*)/) { $h{"$c - $v\n"} = 1 if ($c); $c = $1; $v = $2; } elsif (/(.*)-(.*)/) { $v = $1; } }; print (sort keys %h)

  • Récupération de la liste des codes postaux français
    amstramgram [@], le 28/06/10 à 15:20 :: Répondre

    Pour celles et ceux que ça intéresse, je me suis inspiré de la même idée et j'ai développé une petite application en flex qui se charge de construire une base de données sqlite qui associe communes, code insee, code postal et population.
    Explications, résultats, démo et télechargements ici :
    http://lamemelongueurdonde.com/blog/?cat=24
    Cordialement,
    Laurent.

  • Récupération de la liste des codes postaux français
    Thierry [@], le 06/07/10 à 17:30 :: Répondre

    Bonjour
    Après étude rapide du post et des commentaires, il semble qu'il y ait un problème dans l'extraction des enregistrements dont les villes contiennent un tiret (-).
    Je me suis inpiré du commentaire de GuB, le 16/06/10 à 17:12 :
    Début de citation (Extrait)
    ...
    Il y a cependant quelques bugs dans le fichier final concernant LIERES, LIETTRES, MILHAS, MIREMONT, PLAISANCE, POLASTRON, PONTGOUIN, POUPRY, RIBEYRET, ROCHEBRUNE, ST EULIEN, ST THIEBAULT, TANZAC-THAIRE du style :
    62190-LIETTRES
    LIERES-LIETTRES
    62145-LIETTRES
    au lieu de :
    62190-LIERES
    62145-LIETTRES
    Et un : "a1431800-VILLENEUVE DE RIVIERE" au lieu de "31800-VILLENEUVE DE RIVIERE" (que fait ce "a14" ?)

    A noter que je n'ai pas testé le script, juste le fichier final.
    Fin de citation

    Ayant copié ton fichier de résultat sur un tableur, j'ai isolé les codes postaux contenant des lettres. Je tombe sur les mêmesrésultat que ci-dessus.
    Ensuite, j'ai isolé les villes contenan des tirets (-)
    Il n'y en a pas 'autres que celles posant problème.
    J'en déduit qu'il y a un poblème lors de l'extraction des dnnées pour les villes contenant des tirets (-).
    Je ne sais pas programmer, donc je ne pourrais pas t'aider à corriger ton script.
    En espérant que celà puisse t'aider si tu veux le corriger...
    Et bravo et merci pour le travail réalisé.

    • Re : Récupération de la liste des codes postaux français
      Yannick Torrès, le 14/07/10 à 01:44 :: Répondre

      Script mis à jour (liste comprise).

      Merci Thierry [clin d'oeil]

  • Récupération de la liste des codes postaux français
    Hkane, le 16/07/10 à 16:03 :: Répondre

    Salut et tout d'abord bravo pour ton énorme travail! ne connaissant pas les script... j'aimerai savoir si y'aurai moyen en plus des code postaux d'avoir aussi les cedex? par exemple:
    01150*LAGNIEU
    01151 LAGNIEU CEDEX
    01152 LAGNIEU CEDEX
    01153 LAGNIEU CEDEX
    01154 LAGNIEU CEDEX
    01155 LAGNIEU CEDEX
    01156 LAGNIEU CEDEX
    01157 LAGNIEU CEDEX
    01158 LAGNIEU CEDEX
    01159 LAGNIEU CEDEX
    Merci d'avance [clin d'oeil]

promotion

Saint Martin a donné la moitié de son manteau à un pauvre : comme ça, ils ont eu froid tous les deux.

Jacques Prévert

Tribune

  • 13:38 123
  • 21:16 lapin!!!
  • 14:04 galette
  • 09:14 22:37 :
  • 14:01 Vu le nombre de messages en tribune, j'ai l'impression de prendre 2 ans d'un coup, là !!;)
  • 14:00 merci Gui (car je suppose que c'est toi :) )
  • 10:54 Bon anniversaire à Madame (un peu en retard, pour la deuxième année consécutive) :)
  • 15:29 salut, ca farte ?
  • 23:21 window.location = "URL
  • 10:26 Hello. It is very kind for you to allow guests to post here (if it *is* possible) :)