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

  1. #1
    Membre régulier
    Inscrit en
    juillet 2003
    Messages
    172
    Détails du profil
    Informations forums :
    Inscription : juillet 2003
    Messages : 172
    Points : 75
    Points
    75

    Par défaut [TOS 5.6.2] Import csv d'un dossier en bdd

    Bonjour,

    Je n'ai pas beaucoup d'expérience avec Talend et je souhaiterais importer mensuellement toutes les lignes d'un fichier csv d'un dossier vers une table en base de données.

    Problème :
    - Le fichier csv a un nom différent chaque mois car l'année et le mois concerné sont indiqué dans le nom du fichier (ex : export-2018-08.csv)
    - Je voudrais également récupérer le mois et l'année indiqué dans le nom du fichier afin d'importer ces 2 informations dans les champs "mois" et "année" de la table sql pour chaque ligne du fichier CSV importé.
    - Une fois l'import effectué, supprimer le fichier csv du dossier.

    Pourriez-vous me filer un coup de main ?

    Merci d'avance de votre aide.

    David

  2. #2
    Membre averti

    Homme Profil pro
    Consultant en Business Intelligence
    Inscrit en
    juillet 2011
    Messages
    131
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Consultant en Business Intelligence
    Secteur : Service public

    Informations forums :
    Inscription : juillet 2011
    Messages : 131
    Points : 316
    Points
    316
    Billets dans le blog
    2

    Par défaut

    Salut,

    Pour ça, tu peux utiliser :

    1. Un job père avec les composants suivants :

    tFileList : qui parcourt les fichiers que tu veux importer dans ta BD, et qui se trouvent dans ton dossier.
    tJava : Pour récupérer le mois et l'année dans le nom du fichier
    tRunJob : Pour appeler le Job fils qui récupère dans les contextes le MOIS et l'ANNEE valorisées dans le père et t'alimente ta BD
    tFileCopy : qui te supprime le fichier dans ton dossier source et le met dans un dossier ARCHIVE

    Exemple :

    Job Père :

    Nom : r-jobs.PNG
Affichages : 35
Taille : 8,2 Ko

    tJava_1 :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
     
    String CURRENT_FILE = ((String)globalMap.get("tFileList_1_CURRENT_FILE"));
     
    context.ANNEE = CURRENT_FILE.split("-")[2];
    context.MOIS = CURRENT_FILE.split("-")[1];
     
    System.out.println(CURRENT_FILE );

    Config tFileCopy :

    Nom : r-FileCopy.PNG
Affichages : 34
Taille : 11,0 Ko


    2.Job FIls :

    Nom : r-fils.PNG
Affichages : 34
Taille : 5,0 Ko

    Config tMap :

    Dans le tMap tu récupères le mois et l'année que tu as valorisé dans le père.

    Nom : r-tmap.PNG
Affichages : 35
Taille : 15,6 Ko


    Voilà, c'est juste une idée de la manière dont tu peux faire ça, je suppose que tes fichiers ont le même schéma.
    Utilisez le bouton pour mettre en valeur la ou les réponses qui vous ont été les plus utiles. Marquez comme si c'est le cas.

    ''Le savoir est la seule matière qui s’accroît lorsqu’on la partage.''
    (Socrate)

  3. #3
    Membre régulier
    Inscrit en
    juillet 2003
    Messages
    172
    Détails du profil
    Informations forums :
    Inscription : juillet 2003
    Messages : 172
    Points : 75
    Points
    75

    Par défaut

    Wouah super !

    Je n'en demandais pas autant mais avec toutes ces explications je devrais y arriver.
    Oui les fichiers csv auront le même format à chaque fois.

    Je m'occupe de cela dès que possible et je ne tiens au courant.

    Un grand merci

    David

  4. #4
    Membre régulier
    Inscrit en
    juillet 2003
    Messages
    172
    Détails du profil
    Informations forums :
    Inscription : juillet 2003
    Messages : 172
    Points : 75
    Points
    75

    Par défaut

    Bonjour Netsoro,

    J'ai commencé à créer le 1er job qui commence par récupérer le fichier présent dans le dossier avec le tFileList et le tJava mais quand je lance le job, je récupère l'extension du fichier (.csv) dans la variable de context MONTH.
    J'ai essayé de refaire un split depuis la variable de context MONTH pour séparer le mois de l'extension mais ça ne marche pas.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    String CURRENT_FILE = ((String)globalMap.get("tFileList_1_CURRENT_FILE"));
     
    context.YEAR = CURRENT_FILE.split("-")[2];
    context.MONTH = CURRENT_FILE.split("-")[3];
     
    context.MONTH = context.MONTH.split(".")[1];
     
    System.out.println(CURRENT_FILE );
    System.out.println(context.YEAR );
    System.out.println(context.MONTH );

    De plus j'aurais voulu savoir dans le second job ce qu'il faut mettre dans le tFileInputDelimited comme valeur dans la propriété Filename

    Merci d'avance de ton aide.

    David

  5. #5
    Membre averti

    Homme Profil pro
    Consultant en Business Intelligence
    Inscrit en
    juillet 2011
    Messages
    131
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Consultant en Business Intelligence
    Secteur : Service public

    Informations forums :
    Inscription : juillet 2011
    Messages : 131
    Points : 316
    Points
    316
    Billets dans le blog
    2

    Par défaut

    Salut davelop,

    Citation Envoyé par davelop Voir le message
    Bonjour Netsoro,

    J'ai commencé à créer le 1er job qui commence par récupérer le fichier présent dans le dossier avec le tFileList et le tJava mais quand je lance le job, je récupère l'extension du fichier (.csv) dans la variable de context MONTH.
    J'ai essayé de refaire un split depuis la variable de context MONTH pour séparer le mois de l'extension mais ça ne marche pas.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    String CURRENT_FILE = ((String)globalMap.get("tFileList_1_CURRENT_FILE"));
     
    context.YEAR = CURRENT_FILE.split("-")[2];
    context.MONTH = CURRENT_FILE.split("-")[3];
     
    context.MONTH = context.MONTH.split(".")[1];
     
    System.out.println(CURRENT_FILE );
    System.out.println(context.YEAR );
    System.out.println(context.MONTH );
    Merci d'avance de ton aide.

    David
    La variable ((String)globalMap.get("tFileList_1_CURRENT_FILE")) ne contient pas le ".csv" , c'est la variable ((String)globalMap.get("tFileList_1_CURRENT_FILEPATH")) qui contient le chemin du fichier ainsi que son extension. la version que je t'avais postée, je ne prenais pas en compte le ".csv", car je savais qu'il ne le contenait pas.

    Par contre, tu peux bien utiliser la deuxième ((String)globalMap.get("tFileList_1_CURRENT_FILEPATH")),

    en rajoutant d'ailleurs une variable de context FILEPATH, pour récupérer le fichier courant dans le Job Fils.

    Ainsi, le code ci-dessous marchera, ci tes fichiers ont un nom tel : export-2018-08.csv

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    String CURRENT_FILE = ((String)globalMap.get("tFileList_1_CURRENT_FILEPATH"));
    String[] tab = CURRENT_FILE.split("-");
     
    context.MONTH = tab[2].split(".csv")[0];
    context.YEAR = tab[1];
    context.FILEPATH = CURRENT_FILE;
     
    System.out.println(context.YEAR );
    System.out.println(context.MONTH); 
    System.out.println(context.FILEPATH);
    N'oublie pas de cocher la case transmettre tous le contexte du tRunJob.

    Si tu as un souci n'hésite pas.
    Utilisez le bouton pour mettre en valeur la ou les réponses qui vous ont été les plus utiles. Marquez comme si c'est le cas.

    ''Le savoir est la seule matière qui s’accroît lorsqu’on la partage.''
    (Socrate)

  6. #6
    Membre régulier
    Inscrit en
    juillet 2003
    Messages
    172
    Détails du profil
    Informations forums :
    Inscription : juillet 2003
    Messages : 172
    Points : 75
    Points
    75

    Par défaut

    Bonjour Netsoro,
    Merci beaucoup, je récupère maintenant bien ces 2 variables de context. Juste eu besoin d'une petite adaptation car le chemin contenait un caractère "-"

    Par contre tu n'as sans doute pas vu ma 2eme question que j'ai indiqué en modifiant mon message. Tu devais déjà me répondre à ce moment là . Cela concerne le job enfant, dans le tFileInputDelimited dans lequel on indique le non du fichier csv.
    Comment peut-on l'indiquer ?
    Et question supplémentaire : comment récupérer sa structure (dans le tMap) vu que le nom du fichier sera probablement une variable.

    Encore un grand merci.

    David

  7. #7
    Membre averti

    Homme Profil pro
    Consultant en Business Intelligence
    Inscrit en
    juillet 2011
    Messages
    131
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Consultant en Business Intelligence
    Secteur : Service public

    Informations forums :
    Inscription : juillet 2011
    Messages : 131
    Points : 316
    Points
    316
    Billets dans le blog
    2

    Par défaut

    Salut davelop,

    Citation Envoyé par davelop Voir le message
    Bonjour Netsoro,

    Tu devais déjà me répondre à ce moment là . Cela concerne le job enfant, dans le tFileInputDelimited dans lequel on indique le non du fichier csv.
    Comment peut-on l'indiquer ?
    Et question supplémentaire : comment récupérer sa structure (dans le tMap) vu que le nom du fichier sera probablement une variable.

    David
    Je t'ai répondu sur la manière de récupérer le nom du fichier csv dans le tFileInputDelimited, mais apparemment tu n'as pas compris , au faite dans le code que je t'avais posté :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    
    String CURRENT_FILE = ((String)globalMap.get("tFileList_1_CURRENT_FILEPATH"));
    String[] tab = CURRENT_FILE.split("-");
     
    context.MONTH = tab[2].split(".csv")[0];
    context.YEAR = tab[1];
    context.FILEPATH = CURRENT_FILE;
     
    System.out.println(context.YEAR );
    System.out.println(context.MONTH); 
    System.out.println(context.FILEPATH);
    Les 2 lignes en bleu te permettent de récupérer et de mettre en contexte le fichier csv courant, ensuite dans le fils il te suffit de donner context.FILEPATH comme nom de fichier au composant tFileInputDelimited.
    Pour le schéma tu as au moins 2 manières de le faire :

    • Directement en cliquant dans Editer Schema du composant tFileInputDelimited, puis tu ajoutes les noms de colonnes de ton fichier csv, ainsi que leurs types
    • Ou bien tu crées une métadonnée de Fichier délimité, tu mets d'abord le chemin en dur de ton fichier csv, ensuite tu prévisualises tes données, si tout est ok, tu glisses et déposes a partir des métadonnées le fichier délimité, il gardera le chemin que tu avais mis, dans ce cas dans l'onglet composant click sur le nom du fichier, il te proposera de passer en mode built in,selection => OK, cela te permettra de mettre ça context.FILEPATH , comme nom de fichier. ainsi, quand tu utililieses cette 2e solution tu n'as pas besoin d'ajouter de schema et il te garde le schéma qu'il avait dans la métadonnée.


    Voilà.
    Utilisez le bouton pour mettre en valeur la ou les réponses qui vous ont été les plus utiles. Marquez comme si c'est le cas.

    ''Le savoir est la seule matière qui s’accroît lorsqu’on la partage.''
    (Socrate)

  8. #8
    Membre régulier
    Inscrit en
    juillet 2003
    Messages
    172
    Détails du profil
    Informations forums :
    Inscription : juillet 2003
    Messages : 172
    Points : 75
    Points
    75

    Par défaut

    D'accord merci j'ai compris.
    Désolé je ne maîtrise vraiment pas beaucoup Talend car je ne l'utilise que très rarement.

    Alors je sais j'abuse mais j'ai un autre problème : Le job fils ne récupère pas les variables de context. Pour tester je dois indiquer les valeurs manuellement par défaut pour chaque variable de context.
    Pourtant les 3 System.out.println du tJava affichent bien les 3 valeurs de ces 3 context;

    Pour infos ce sont des variables de context général du repository que j'ai définis et que j'ai importé dans les 2 jobs et qui apparaissent donc en grisé dans les 2 jobs.

    Est-ce bien cela qu'il fallait faire ?

    Ou alors il faut des context propres au job père qui faut ensuite transmettre au job fils ? Si oui je ne vois pas comment on fait cela ?

    On va finir par y arriver
    Merci pour ta patience.

    David

  9. #9
    Membre averti

    Homme Profil pro
    Consultant en Business Intelligence
    Inscrit en
    juillet 2011
    Messages
    131
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Consultant en Business Intelligence
    Secteur : Service public

    Informations forums :
    Inscription : juillet 2011
    Messages : 131
    Points : 316
    Points
    316
    Billets dans le blog
    2

    Par défaut

    Citation Envoyé par davelop Voir le message
    Alors je sais j'abuse mais j'ai un autre problème
    Non, c'est avec plaisir que je réponds, moi aussi lorsque j'ai commencé à utiliser Talend je ne savais pas, c'est grâce au partage que je commence à connaitre, je continue mon apprentissage de Talend que j'aime bien.

    Citation Envoyé par davelop Voir le message
    Pourtant les 3 System.out.println du tJava affichent bien les 3 valeurs de ces 3 context;
    Si tu arrives a afficher les contextes dans le père, et que tu as ajouté ces contextes à travers le repository dans le père et le fils => c'est qu'on est bon .

    Citation Envoyé par davelop Voir le message
    Ou alors il faut des context propres au job père qui faut ensuite transmettre au job fils ? Si oui je ne vois pas comment on fait cela ?
    Il suffit juste de sélectionner le composant tRunJob, dans son onglet Component cocher la case Transmettre tout le contexte, ceci permettra de transmettre les valeurs des contextes du père au fils (Aussi simple que ça ).

    Exemple :

    Nom : r-contexte.PNG
Affichages : 26
Taille : 13,7 Ko
    Utilisez le bouton pour mettre en valeur la ou les réponses qui vous ont été les plus utiles. Marquez comme si c'est le cas.

    ''Le savoir est la seule matière qui s’accroît lorsqu’on la partage.''
    (Socrate)

  10. #10
    Membre régulier
    Inscrit en
    juillet 2003
    Messages
    172
    Détails du profil
    Informations forums :
    Inscription : juillet 2003
    Messages : 172
    Points : 75
    Points
    75

    Par défaut

    Nickel !

    A part un dernier point que je vais essayer de trouver tout seul, maintenant ça fonctionne impeccablement.

    Encore merci pour tout ton aide !

  11. #11
    Membre averti

    Homme Profil pro
    Consultant en Business Intelligence
    Inscrit en
    juillet 2011
    Messages
    131
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Consultant en Business Intelligence
    Secteur : Service public

    Informations forums :
    Inscription : juillet 2011
    Messages : 131
    Points : 316
    Points
    316
    Billets dans le blog
    2

    Par défaut

    Citation Envoyé par davelop Voir le message
    Nickel !

    A part un dernier point que je vais essayer de trouver tout seul, maintenant ça fonctionne impeccablement.

    Encore merci pour tout ton aide !
    Cool, alors tu peux mettre sur les réponses pertinentes, et marquer ce topic comme résolu serait parfait. Si tu as d'autres problèmes tu peux ouvrir un autre topic.
    Utilisez le bouton pour mettre en valeur la ou les réponses qui vous ont été les plus utiles. Marquez comme si c'est le cas.

    ''Le savoir est la seule matière qui s’accroît lorsqu’on la partage.''
    (Socrate)

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

Discussions similaires

  1. Import CSV sous Excel, garder les 0 inutile
    Par ePoX dans le forum Excel
    Réponses: 4
    Dernier message: 26/01/2009, 16h25
  2. [ACCESS 2003] - Importation *.csv
    Par guiguikawa dans le forum Access
    Réponses: 3
    Dernier message: 29/06/2006, 16h19
  3. Importer CSV dans MySQL
    Par The_freeman dans le forum Administration
    Réponses: 6
    Dernier message: 14/02/2006, 22h18
  4. import csv décimale
    Par gIch dans le forum MS SQL-Server
    Réponses: 5
    Dernier message: 13/12/2005, 12h46
  5. Importation CSV vers base de données
    Par Brice Yao dans le forum Bases de données
    Réponses: 1
    Dernier message: 29/06/2005, 13h42

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