Lors d’une formation chez un client la semaine dernière, nous avons eu besoin de récupérer des données directement sur le site web de l’UNEDIC (http://unistatis.orsid.com).
Ce site propose en effet une interface assistée pour le téléchargement de fichiers d’export au format CSV ou XLS.
Tout se passe plutôt bien lorsqu’on veut télécharger les données d’une seule région ou de 4 départements, mais cela se complique si on veut récupérer les données de tous les départements français et ceci sur les 10 dernières années (ça risque de prendre la journée !!!)
Heureusement, Kettle est là pour automatiser tout ça, encore faut-il vérifier que la récupération des données via le web est automatisable.
Première étape, vérifier que les fichiers d’export peuvent être appelés directement via une méthode get ou post.
Un petit coup de Firebug, et oui c’est bon, on devrait s’en sortir avec du HTTP POST.
Le petit code ci-dessous (à copier dans un fichier HTMl en local) nous permet déjà de gagner de précieuses secondes :
<html> <FORM METHOD="post" NAME = "monform_csv" ACTION="http://unistatis.orsid.com/index.php?index.php"> <INPUT TYPE="text" NAME = "format" VALUE="csv"> (csv ou xls)<br/> <INPUT TYPE="text" NAME = "niveau" VALUE="export"><br/> <INPUT TYPE="text" NAME = "codeae" VALUE="NAF732"> (NAF232, A88, A38 ou A17)<br/> <INPUT TYPE="text" NAME = "niveau0" VALUE="2007"><br/> (2008, 2007, 2006, ...) <INPUT TYPE="text" NAME = "niveau1" VALUE="R"> <br/> <select name="niveau2"> <option value="ALSACE">ALSACE</option> <option value="AQUITAINE">AQUITAINE</option> <option value="AUVERGNE">AUVERGNE</option> <option value="BASSE-NORMANDIE">BASSE-NORMANDIE</option> <option value="BOURGOGNE">BOURGOGNE</option> <option value="BRETAGNE">BRETAGNE</option> <option value="CENTRE">CENTRE</option> <option value="CHAMPAGNE-ARDENNE">CHAMPAGNE-ARDENNE</option> <option value="CORSE">CORSE</option> <option value="FRANCHE-COMTE">FRANCHE-COMTE</option> <option value="GUADELOUPE">GUADELOUPE</option> <option value="GUYANE">GUYANE</option> <option value="HAUTE-NORMANDIE">HAUTE-NORMANDIE</option> <option value="ILE-DE-FRANCE">ILE-DE-FRANCE</option> <option value="LANGUEDOC-ROUSSILLON">LANGUEDOC-ROUSSILLON</option> <option value="LIMOUSIN">LIMOUSIN</option> <option value="LORRAINE">LORRAINE</option> <option value="MARTINIQUE">MARTINIQUE</option> <option value="MIDI-PYRENEES">MIDI-PYRENEES</option> <option value="NORD-PAS-DE-CALAIS">NORD-PAS-DE-CALAIS</option> <option value="PAYS-DE-LA-LOIRE">PAYS-DE-LA-LOIRE</option> <option value="PICARDIE">PICARDIE</option> <option value="POITOU-CHARENTES">POITOU-CHARENTES</option> <option value="PROVENCE-ALPES-COTE D AZUR">PROVENCE-ALPES-COTE D"AZUR</option> <option value="REUNION">REUNION</option> <option value="RHONE-ALPES">RHONE-ALPES</option> </select>(Choisir la région dans la liste déroulante)<br/> <A HREF="javascript:monform_csv.submit();">TELECHARGER LE FICHIER</A> </FORM> </html> |
Deuxième étape, voir comment on peut automatiser la récupération des données avec Kettle.
J’ai essayé avec l’étape HTTP Client (Post), mais rien n’y fait, je n’ai pas réussi à configurer l’étape (can someone help me ?).
Pas très grave, comme les fichiers CSV sont un peu mal foutus (y’a pleins de lignes gênantes au début), je vais écrire une petite classe dédiée en JAVA pour récupérer mes données via un appel Http Post.
La classe Java ressemble à ceci, elle prend 2 paramètres en entrée, l’année et le département, ce qui est bien pratique pour récupérer uniquement les fichiers dont on a besoin :
package fr.osbi.kettle; import java.io.OutputStreamWriter; import java.io.BufferedReader; import java.io.InputStreamReader; import java.io.PrintWriter; import java.io.FileWriter; import java.net.URL; import java.net.URLConnection; public class Unedic { public static void main(String[] args) { String annee = args[0]; String dept = args[1]; OutputStreamWriter writer = null; BufferedReader reader = null; try { // Paramètres du POST HTTP String donnees = "format=csv"; donnees += "&niveau=export_csv"; donnees += "&codeae=NAF732"; donnees += "&niveau0=" + annee; donnees += "&niveau1=C"; donnees += "&niveau2=" + dept; donnees += "&niveau3=ALL"; // création de la connection URL url = new URL("http://unistatis.orsid.com/index.php"); URLConnection conn = url.openConnection(); conn.setDoOutput(true); // envoi de la requête writer = new OutputStreamWriter(conn.getOutputStream()); writer.write(donnees); writer.flush(); // lecture de la réponse reader = new BufferedReader(new InputStreamReader(conn.getInputStream())); String line; PrintWriter fichier = new PrintWriter(new FileWriter("C:\\Export Unedic_" + annee + "_" + dept + ".CSV")); // compteur de ligne pour écarter les lignes 1,2,3,4,5,6,8 (structure hybride du fichier généré !) Integer lineCount = 0; while ((line = reader.readLine()) != null) { lineCount++; System.out.println("Ligne n°" + lineCount + " " + line); if (!(lineCount <= 6 || lineCount == 8)) fichier.println(line); } fichier.close(); } catch (Exception e) { e.printStackTrace(); } finally { try { writer.close(); } catch (Exception e) { } try { reader.close(); } catch (Exception e) { } } } } |
ETAPE 3 : l’automatisation avec Kettle
Pour cela, il faut exporter la classe Java compilée sous forme de JAR exécutable (getUnedicFiles.jar)
Le JAR prendra donc en entrée 2 paramètres lors de son appel :
- année
- département
Une transformation Kettle sera chargée de générer autant de tuples [année | département] que de fichiers CSV voulus :
Un job permettra ensuite d’appeler de façon automatique le programme Java :
Et hop, une fois que tout ça est fait, ça roule : les fichiers désirés sont déposés sous « C:\ »
Bien sûr j’aurai pu aussi développer un plugin Kettle pour récupérer les données des fichiers CSV sous forme de stream (flux) pour directement les injecter dans mon système cible (une base MySql).
Peut-être cela fera-t’il l’objet d’un prochain post 🙂
Si certains d’entre vous sont intéressés, le traitement complet (ZIP) est récupérable ici:
Traitement Kettle récupération fichiers UNEDIC
Il suffit de décompresser l’ensemble des fichiers contenus dans le zip dans un répertoire osbi.fr , directement dans le répertoire d’installation de Kettle. On lancera ensuite le job \osbi.fr\unedic_job.kjb
PS: Pascal, à vous de jouer maintenant… 😉
mmmmmmmmmmmmmmmmmmmmmmmerciiiiiiiiiiiiiiiiiiii
Bonjour
DeeeeeeeeeeeeeeeeeeeeeeeRieeeeeeeeeeeeeen