OSBI.FR - Open Source Business Intelligence

TechTip: Récupération de fichiers avec Kettle en Http Post

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.

unedic1

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 :

unedic2

Un job permettra ensuite d’appeler de façon automatique le programme Java :

unedic3

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… 😉

2 Comments

Les commentaires sont fermés.