Actualités

[25/06/2013] CMSday : Mardi 25 juin - 2ème édition de la journée consacrée aux CMS open source

Rendez-vous le 25 juin à la MAS-Paris (13ème arrondissement) de 9h00 à 18h00 pour une journée dédiée à la gestion de contenu open source

[14/06/2013] Smile participe à la journée DevelopR6, 14 juin à Vandoeuvre les Nancy

Rendez-vous le Vendredi 14 juin à Vandoeuvre les Nancy pour assister à la journée DevelopR6.

[06/06/2013] Smile, partenaire Platinum du Liferay France Symposium

La seconde édition du Liferay France Symposium se tiendra à Paris le 6 juin de 9h à 18h, au Shangri-La Hôtel dans le 16e arrondissement.

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

Soyez la premiere personne à ajouter un commentaire sur cet article.
Ecrire un nouveau commentaire