Actualités

[23/04/2014] Pour sa 3ème édition le CMSday prend une nouvelle envergure

Rendez-vous le Mardi 17 juin 2014 à Paris. Une surface d'exposition doublée, plus de 1 000 visiteurs attendus, 3 nouveaux co-organisateurs, le CMSday sera cette année, le rendez-vous phare de la gestion de contenu open source et des stratégies digitales.

[11/04/2014] Smile gagne un Jedox Award

Smile reçoit le trophée de Meilleur Partenaire Jedox de l'année.

[10/04/2014] Smile co-organisateur du Bargento 2014

Smile et NBS System s’associent pour l’organisation du Bargento qui se tiendra le 7 octobre prochain à Paris.

Toutes les actualités picto
       

Vous avez besoin de mettre à jour votre Lecteur Flash Flash 7

Guillemet ouvrant l'actualité des solutions
et des technologies open source Guillemet fermant
picto

Gérer des fichiers Excel avec des colonnes dans le désordre avec Talend Open Studio

L'ETL Talend permet de gérer simplement l'import de données depuis des fichiers Excel.
Par contre, dans les cas où un utilisateur doit déposer un fichier Excel source dans un dossier spécifique, l'ordre des colonnes n'est malheureusement pas toujours rigoureusement respecté.
Il n'y a pas de composant dédié pour gérer ce genre de problématique, aussi la puissance de Java disponible avec Talend est ici utile.

L'ETL Talend permet de gérer simplement l'import de données depuis des fichiers Excel. Par contre, dans les cas où un utilisateur doit déposer un fichier Excel source dans un dossier spécifique, l'ordre des colonnes n'est malheureusement pas toujours rigoureusement respecté.

Il n'y a pas de composant dédié pour gérer ce genre de problématique, aussi la puissance de Java disponible avec Talend est ici utile.

Pour ce faire, deux étapes sont nécessaires :

  • récupération du schéma du fichier source, stocké dans une variable de type HashMap
  • association des champs dans le schéma de sortie pour chaque ligne de flux.

TOS schema dynamique

On commence d'abord par paramétrer la variable globale qui va accueillir l'en-tête de notre fichier. Celle-ci sera de type java.util.Map. On utilise le composant tSetGlobalVar pour déclarer cette variable, paramétré comme suit :

  • Clé : « FieldMap »
  • Valeur :  new HashMap<String, String>()

On crée ensuite les métadonnées à partir de notre fichier Excel, sans redéfinir le schéma à partir de l'en-tête : c'est inutile puisque cet en-tête est variable ! Il sera correct pour le fichier en cours mais obsolète pour un autre. Les seules données fixes dont on dispose sont le nombre de colonnes et le nom de ces colonnes. L'ordre, quant à lui, est aléatoire.

On utilise le composant tFileInputExcel pour importer notre fichier, en imposant la limite à 1 puisque l'on veut ne récupérer que la première ligne contenant l'en-tête des colonnes. On place un tJavaRow à la sortie pour stocker cet en-tête dans la variable FieldMap définie précédemment, paramétré avec le code suivant :

Map<String, String> fieldMap = (Map<String, String>)globalMap.get("fieldMap");
for( Field f : row1.getClass().getFields() ) {
    fieldMap.put((String)f.get(row1), f.getName());
}

On note au passage comment récupérer l'ensemble des champs d'une ligne et les valeurs associées, simplement avec quelques bouts de code Java. Ajouter l'import des librairies java.util.* et java.lang.reflect.* dans les paramètres avancés du composant.

Enfin, on récupère l'ensemble des lignes sans en-tête à l'aide d'un second composant tFileInputExcel. On le lie à un tMap en sortie pour faire la correspondance et placer les colonnes dans l'ordre voulu :

TOS schema dynamique 2

On utilise des variables pour récupérer le nom de la colonne dans les métadonnées (dans notre exemple, A, B, C ou D) associé au nom réel de la colonne :

fn_NOM_REEL = ((Map<String,String>)globalMap.get("fieldMap")).get("NOM_REEL_COLONNE")

Chaque variable lit donc le tableau de correspondance créé en utilisant le nom réel de la colonne comme clé. On définit pour finir la valeur de la colonne de sortie :

(String)row2.getClass().getField(Var.fn_NOM_REEL).get(row2)

Par souci de simplification, les types de données traitées sont des String : il y a donc des conversions à faire dans le tMap pour typer correctement les données. Il ne reste plus qu'à placer un composant tLogRow (ou un autre composant de chargement) en sortie et le tour est joué !

Sources : http://bekwam.blogspot.fr/2011/06/dynamic-schemas-in-talend-open-studio.html

Pierre Antoine Marc
picto

Commentaires

       
Marc
Bonjour,
post très intéressant, mais les images sont trop petites pour que l'on puisse lire les jobs ...
vendredi 19 juillet 2013 @ 14:10
       

       
zahra
Et si le nombre de colonnes n'est pas fixe ?
mercredi 20 novembre 2013 @ 11:10
       
Ecrire un nouveau commentaire