Actualités

[02/09/2014] Smile Paris déménage

A compter du 30 août 2014, le siège social de Smile emménage dans de nouveaux locaux à Asnières-sur-Seine.

[17/07/2014] Retrouvez la vidéo du Webinar : Etre autonome sur sa communication web

Découvrez la vidéo du webinar Ametys et Smile, pour bénéficier des retours d’expérience de la Ville de Cannes et voir comment la collectivité utilise la solution de gestion de contenu Ametys pour gérer l'ensemble de ses portails web et accroître leur visibilité.

[07/07/2014] Découvrez le nouveau site de Smile e-Commerce Performances

E-commerçants, ne laissez pas votre site ralentir votre chiffre d'affaires ! Sur le site e-Commerce Performances, découvrez comment les innovations technologiques permettent d'améliorer les performances de votre site e-commerce en Magento.

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