IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Développement de jobs Discussion :

Réagencer un flux de données


Sujet :

Développement de jobs

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Juin 2009
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2009
    Messages : 11
    Points : 5
    Points
    5
    Par défaut Réagencer un flux de données
    Bonjour à tous.

    Nouvellement inscrit sur ce forum, bien que le consultant déjà depuis pas mal de temps, je viens vous contacter pour vous demander s'il était possible de m'aider à enlever une épine du pied.

    Actuellement en stage de quatre mois dans une entreprise, nous implantons actuellement Talend pour gérer toutes les informations au sein de celle-ci.

    Jusqu'à présent, j'ai réussi à trouver toutes les informations dont j'ai besoin dans ce forum ou sur internet, si ce n'était pas dans les guides déjà rédigés.

    Je vous explique rapidement le soucis :

    Chaque secteur à un identifiant précis, un budget, et nous suivons les dépenses de chacun d'entre eux mois par mois.
    Nous avons des anciens relevés, assez nombreux, fichiers excel basiques, que nous souhaitons intégrer dans nos nouvelles bases de données. Cependant, ce fichier présente les données sous un certain format, et nous les voulons dans un format certain.

    Voilà le découpage excel des colonnes :
    ID service / Janvier / Février / Mars / Avril / ...

    ID service est donc l'identifiant du service concerné, et sous chaque mois, le montant dépensé.

    Voilà le découpage présent dans la base de données :
    ID service / Mois du relevé / Montant

    Connaitriez vous un moyen de faire cette modification à l'aide de composants Talend ?

    EDIT : Je pensais tenter de jongler avec les ID des colonnes des fichiers excel (ils ont tous le même découpage), mais je coince encore et toujours malgré mes recherches. Le Map ayant quelques éléments programmés ne suffit pas, et je ne connais pas la variable qui permettrait - si elle existe - de récupérer le numéro d'une colonne. (Projet développé coté Java)

  2. #2
    Rédacteur
    Avatar de CyberChouan
    Homme Profil pro
    Directeur technique
    Inscrit en
    Janvier 2007
    Messages
    2 752
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Directeur technique
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Janvier 2007
    Messages : 2 752
    Points : 4 314
    Points
    4 314
    Par défaut
    Il faut jouer avec les composants tNormalize et tDeNormalize pour répondre à ce genre de problématiques.

    Je te laisse vérifier les manuels de ces différents composants
    Avant de poster, pensez à regarder la FAQ, les tutoriaux, la Javadoc (de la JRE que vous utilisez) et à faire une recherche
    Je ne réponds pas aux questions techniques par MP: les forums sont faits pour ça
    Mes articles et tutoriaux & Mon blog informatique

  3. #3
    Futur Membre du Club
    Profil pro
    Inscrit en
    Juin 2009
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2009
    Messages : 11
    Points : 5
    Points
    5
    Par défaut
    Je ne m'attendais pas à une réponse si rapide.

    Parfait, je vais jeter un oeil à ces deux composants.
    Si je m'en sort seul, je proposerai une petite solution/exemple pour ceux qui pourraient en avoir besoin.
    Si j'ai une tuile, je reviendrais vous voir

    Merci.

  4. #4
    Futur Membre du Club
    Profil pro
    Inscrit en
    Juin 2009
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2009
    Messages : 11
    Points : 5
    Points
    5
    Par défaut
    J'ai devant moi, sous les yeux, les manuels de ces deux composants.

    Si j'ai bien compris, le Denormalize permet de rassembler les données contenues dans des colonnes, données associées à chaque entrée d'une colonne précise.
    x 1
    x 2
    x 3
    y 1
    y 2

    devenant donc
    x 1 2 3
    y 1 2

    Le Normalize quant à lui permet de faire l'inverse, une liste de type :
    x 1,2,3
    devenant donc, si on lui donne comme caractère séparateur ",",
    x 1
    x 2
    x 3.
    Soit.

    Le fichier source contient une trentaine de colonnes, je fais en sorte que le flux en ignore assez pour n'en conserver que 13 : la colonne ID et les 12 mois.

    Je suis en train d'effectuer des tests avec Normalize pour voir si je ne pourrais pas jongler avec les résultats donnés.

    Cependant, après quelques pérégrinations sur le net, je suis tombé sur quelque chose de plus étrange et vraiment intéressant :
    Un petit module développé par Plegall, "tUnpivotRow", dont il donne un petit tutoriel à cette page.

    Je vois que ce composant semble être plus destiné pour Perl, mais peut on faire en sorte qu'il puisse être utilisé sur un projet codé en Java ? Ou est ce réellement impossible ? Je recherche s'il n'existe pas d'autres composants de ce type pour Java.

    EDIT : ok question idiote. Le composant est bel et bien codé en Perl, donc inexploitable. Par contre j'ai trouvé son homologue coté Java. Je suis en train de chercher un moyen de l'importer convenablement.

  5. #5
    Futur Membre du Club
    Profil pro
    Inscrit en
    Juin 2009
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2009
    Messages : 11
    Points : 5
    Points
    5
    Par défaut
    Navré pour le triple post, mais mes tentatives font chou blanc.

    J'ai essayé diverses techniques concernant le Unpivot proposé par Plegall (pivot pour le langage PERL) que j'ai cité ci-dessus sur un Projet codé en Perl, et l'Unpivot de Mhirt, toujours sur TalendForge. Je n'ai pas réussi à les utiliser convenablement, sans doute ais je oublié quelque chose.

    J'ai ici un autre sujet sur TalendForge où l'on propose une solution pour des fichier délimités. Je vais la tester de ce pas.

    Mais si vous avez une idée sur comment simplifier tout ça à l'aide de Normalize et Denormalize, je suis preneur.

  6. #6
    Membre éprouvé
    Homme Profil pro
    Architecte Décisionnel
    Inscrit en
    Février 2008
    Messages
    866
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Architecte Décisionnel

    Informations forums :
    Inscription : Février 2008
    Messages : 866
    Points : 1 260
    Points
    1 260
    Par défaut
    Bonjour,

    Si j'ai bien compris la problématique, il suffit d'utiliser un tNormalize sur une structure qui aurait cette forme :

    ID Service / Montant

    La colonne montant étant la concaténation des 12 montants, séparés par un séparateur.
    La normalisation se fait donc sur le champ montant, avec le séparateur utilisé.

    Je pense que la génération du mois doit se faire automatiquement (La première ligne obtenue pour un ID Service est le mois de janvier, et ainsi de suite). Pour cela, utiliser une séquence dans un tMap, et déduire le mois du numéro de la ligne pour l'ID Service.

    Nicolas

  7. #7
    Futur Membre du Club
    Profil pro
    Inscrit en
    Juin 2009
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2009
    Messages : 11
    Points : 5
    Points
    5
    Par défaut
    Hé bien, je dois vous remercier tous deux, CyberChouan et DevNico.

    Il s'agissait bien d'une utilisation du composant "tNormalize".
    Je n'avais vraiment pas compris qu'il fallait concaténer la totalité des montants des douze mois dans un seul champ, séparés par des séparateurs (ouep, lapalissade).


    Bon je vais rédiger un petit cas pratique, peut être que ça aidera.

    Exemple fictif :
    ID / Nom_Secteur / Janvier / Fevrier / Mars / ...
    1 / Reprographie / 100 / 200 / 150 / ...
    2 / Comptabilité / 150 / 50 / 100 / ...
    3 / Direction / 50 / 100 / 120 / ...
    4 / RessourcesH / 230 / 150 / 130 / ...

    Le fichier source doit avoir la première ligne comme titre de colonnes.
    La première chose à faire est d'associer à cette source une Map comportant trois colonnes en sortie (je ne sais pourquoi, mais il faut que la colonne à normaliser soit impérativement en seconde position) :
    ID / Montant / Nom_Secteur
    ayant pour contenu dans la map :
    ID -> row1.ID
    Montant -> row1.Janvier+";"+row1.Fevrier+";"+row1.Mars+...
    Nom_Secteur -> row1.Nom_Secteur

    Liez ensuite la sortie de la map à un tNormalize, et calibrez le sur "Montant", séparateur ";".

    Votre sortie sera alors sous la forme de 2 colonnes, l'une étant les ID, l'autre montant :
    ID / Montant / Secteur
    1 / 100 / Reprographie
    1 / 200 / Reprographie
    1 / 150 / Reprographie
    ...
    2 / 150 / Comptabilité
    2 / 50 / Comptabilité
    2 / 100 / Comptabilité
    ...


    Bon maintenant l'ennui est maintenant d'y stocker les mois. Via un iterateur peut être...

  8. #8
    Membre éprouvé
    Homme Profil pro
    Architecte Décisionnel
    Inscrit en
    Février 2008
    Messages
    866
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Architecte Décisionnel

    Informations forums :
    Inscription : Février 2008
    Messages : 866
    Points : 1 260
    Points
    1 260
    Par défaut
    Citation Envoyé par MadWR Voir le message
    La première chose à faire est d'associer à cette source une Map comportant trois colonnes en sortie (je ne sais pourquoi, mais il faut que la colonne à normaliser soit impérativement en seconde position)
    Tu es sûr de ce point ? Il ne me semble pas avoir fait attention à l'emplacement de la colonne que je normalisais.


    Citation Envoyé par MadWR Voir le message
    Bon maintenant l'ennui est maintenant d'y stocker les mois. Via un iterateur peut être...
    La solution que je te proposais :

    - En utilisant une séquence basée sur l'ID. Cette séquence s'incrémente donc à chaque nouvelle ligne d'un même ID, et se remet à 0 pour un nouvel ID.
    Tu as donc directement ton numéro de mois.

    Nicolas

  9. #9
    Futur Membre du Club
    Profil pro
    Inscrit en
    Juin 2009
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2009
    Messages : 11
    Points : 5
    Points
    5
    Par défaut
    Pour le tNormalize :
    Je viens de refaire un essai, et ce coup-ci ça a marché convenablement. A croire que Talend n'avait pas pris les modifs en compte malgré les synchro. des colonnes...
    En fait, c'est une erreur de ma part : je faisais une "DataPreview" sur la sortie, au lieu d'exécuter le Job en premier lieu et de faire ensuite une "DataPreview". Le nom des colonnes ne se mettait pas correctement à jour dans la "DataPreview"...

    Pour la Séquence :
    La séquence ne fonctionnait pas correctement, du moins pas comme je le souhaitais. J'ai trouvé un moyen de l'utiliser d'une manière un peu brouillonne mais fonctionnant parfaitement.
    Ce que j'ai tenté était de l'insérer avant la "Normalization". Chose idiote car - logique - elle n'incrémentait que lorsque l'ID changeait, et non lorsque les mois changeaient (j'imagine qu'il y'a un moyen, mais je ne me suis pas totalement penché dessus).
    J'ai voulu ensuite l'insérer après la "Normalization". Je me retrouvais avec, dans le cas donné en exemple, les mois chiffrés de 1 à 12 pour l'ID n°1, 13 à 24 pour l'ID n°2, 25 à 36 pour l'ID n°3.
    J'ai pas cherché midi à quatorze heure, j'y ai collé un modulo.


    Donc voilà comment procéder, je fais un résumé :

    Départ :
    Exemple fictif :
    ID / Nom_Secteur / Janvier / Fevrier / Mars / ...
    1 / Reprographie / 100 / 200 / 150 / ...
    2 / Comptabilité / 150 / 50 / 100 / ...
    3 / Direction / 50 / 100 / 120 / ...
    4 / RessourcesH / 230 / 150 / 130 / ...

    Premier composant :
    Un composant d'entrée, créant la base en metadata, prenant la première ligne comme titre des colonnes.

    Second composant :
    tMap.
    Flux d'entrée (row1 ici) :
    le nom des colonnes ci-dessus.
    Flux de sortie :
    Id -> row1.Id
    Nom_Secteur -> row1.Nom
    Montants -> row1.Janvier+";"+row1.Fevrier+";"+row1.Mars+...

    Troisième composant :
    tNormalize, dont les réglages sont :
    Column to normalize : Montants
    Item separator : ";"

    Quatrième composant :
    tMap.
    Flux d'entrée (row3 ici) :
    Id / Nom_Secteur / Montants
    Flux de sortie :
    Id -> row3.Id
    Nom_Secteur -> row3.Nom_Secteur
    Mois -> Mathematical.MOD(Numeric.sequence("s1",0,1),12)+1
    (Attention, les numéros des mois seront de type "Double", il faut penser à les convertir en entier si cela gêne et que votre sortie ne peut pas accepter les "Double".)
    Montant -> row3.Montant

    Ca fait un peu sale, mais ça a le mérite de fonctionner parfaitement.

    Cinquième composant :
    Composant de sortie, paramétré pour recueillir donc ces informations.

    Etat final donc :
    ID / Nom_Secteur / Mois / Montant
    1 / Reprographie / 1.0 / 100
    1 / Reprographie / 2.0 / 200
    1 / Reprographie / 3.0 / 150
    ....
    2 / Comptabilité / 1.0 / 150
    2 / Comptabilité / 2.0 / 50
    2 / Comptabilité / 3.0 / 100
    ...
    3 / Direction / 1.0 / 50
    3 / Direction / 2.0 / 100
    3 / Direction / 3.0 / 120
    ...
    4 / RessourcesH / 1.0 / 230
    4 / RessourcesH / 2.0 / 150
    4 / RessourcesH / 3.0 / 130
    ...


    Voilà, je vais mettre cet exemple pleinement en pratique à partir de notre source, et je verrais si ça se case parfaitement lors des tests. Si ça coince, je posterai. Si ça marche, bha... de même
    Merci encore pour votre aide.

  10. #10
    Membre éprouvé
    Homme Profil pro
    Architecte Décisionnel
    Inscrit en
    Février 2008
    Messages
    866
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Architecte Décisionnel

    Informations forums :
    Inscription : Février 2008
    Messages : 866
    Points : 1 260
    Points
    1 260
    Par défaut
    Citation Envoyé par MadWR Voir le message
    J'ai voulu ensuite l'insérer après la "Normalization". Je me retrouvais avec, dans le cas donné en exemple, les mois chiffrés de 1 à 12 pour l'ID n°1, 13 à 24 pour l'ID n°2, 25 à 36 pour l'ID n°3.
    J'ai pas cherché midi à quatorze heure, j'y ai collé un modulo.

    Mois -> Mathematical.MOD(Numeric.sequence("s1",0,1),12)+1
    Sur ce point, c'est parce que la séquence doit être basée sur l'ID.
    A la place de "s1", il faut mettre row3.Id

  11. #11
    Futur Membre du Club
    Profil pro
    Inscrit en
    Juin 2009
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2009
    Messages : 11
    Points : 5
    Points
    5
    Par défaut
    En effet, ta proposition est parfaite. Elle a correctement fonctionné, et nos fichiers de tests sont actuellement alimentés - si ce n'est pas déjà fini, il ne faut pas 107 ans j'imagine...


    Merci encore une fois pour toute l'aide que vous m'avez apporté.

  12. #12
    Futur Membre du Club
    Profil pro
    Inscrit en
    Juin 2009
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2009
    Messages : 11
    Points : 5
    Points
    5
    Par défaut
    Navré de ne pas être revenu plus tôt.

    Aucun incident, nous avons donc pu intégrer ces documents dans nos bases de données. Merci pour tout.

    Que dois je faire pour que cet article serve à toute personne pouvant être dans mon cas?

  13. #13
    Futur Membre du Club
    Inscrit en
    Avril 2010
    Messages
    9
    Détails du profil
    Informations forums :
    Inscription : Avril 2010
    Messages : 9
    Points : 8
    Points
    8
    Par défaut Normalisation avec Tnormalize
    Bonjour,
    j'ai fais tout ce que vous avez dit dans votre thread sauf que moi je dois décrémenter les années de 2009 à 1990. Pourriez vous me dire comment faire car à chaque année correspond un prix. La colonne des montants a été normalisée, maintenant je dois ajouter une colonne année (de 2009 à 1990) afin de faire correspondre les montants aux années. Quelqu'un peut 'il m'aider?
    Merci pour votre aide

  14. #14
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2013
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2013
    Messages : 8
    Points : 7
    Points
    7
    Par défaut Pivoter un tableau
    Bonjour a tous,

    Je cherche à comment faire sur Talend pour faire cette manipulation, j'ai comme fichier source l'exemple suivant :

    Entete1;Entete2;Entete3
    A;X;1
    A;Y;2
    B;X;1
    C;Y;1
    C;Z;3
    D;X;1

    et je veux dans ma sortie un résultat comme ça :

    Entete1;X;Y;Z
    A;1;2;0
    B;1;0;0
    C;0;1;3
    D;1;0;0


    Voila, j'arrive pas à résoudre ce cas la, j'ai besoin de votre aide, je serai très reconnaissant

    Merci d'avance.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Flux de données C# 2.0
    Par jpo dans le forum Accès aux données
    Réponses: 2
    Dernier message: 12/10/2006, 09h13
  2. [AJAX/XML/JAVA] Afficher un flux de données depuis un site web
    Par chodaboy34 dans le forum Général JavaScript
    Réponses: 1
    Dernier message: 10/10/2006, 16h38
  3. Réponses: 1
    Dernier message: 24/05/2006, 12h10
  4. [XML] [EXPAT] traitement d'un flux de donnée xml contenant des \n
    Par firejocker dans le forum Bibliothèques et frameworks
    Réponses: 5
    Dernier message: 23/02/2006, 16h49
  5. Rediriger un flux de données sous linux
    Par Nicaisse dans le forum POSIX
    Réponses: 7
    Dernier message: 01/07/2003, 16h04

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo