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 :

Remplacer NULL par O sur plusieurs champs


Sujet :

Développement de jobs

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2003
    Messages
    94
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2003
    Messages : 94
    Points : 53
    Points
    53
    Par défaut Remplacer NULL par O sur plusieurs champs
    Bonjour,

    Je débute avec Talend et je suis confronté au problème suivant :

    J'ai un fichier CSV que j'importe dans une Table Oracle. Lors de l'import je voudrais remplacer tous les valeurs NULL par '0', et ce pour tous les champs. Dans ce cas précis j'ai 453 champs autant vous dire que je préfère avoir une méthode automatique que je n'ai pas à implémenter sur les 453 champs

    Que faut il faire ? Une routine ?


    Fred

  2. #2
    Modérateur
    Avatar de XxArchangexX
    Homme Profil pro
    Conseil - Consultant en systèmes d'information
    Inscrit en
    Mars 2012
    Messages
    1 159
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France

    Informations professionnelles :
    Activité : Conseil - Consultant en systèmes d'information
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Mars 2012
    Messages : 1 159
    Points : 2 323
    Points
    2 323
    Par défaut
    Bonsoir,

    Tu as plusieurs options pour modifier des données avant import dans ta base :

    Le plus utilisé, le tMap version plus graphique que le second.
    sinon le tJavaRow donc en java directement ou en passant par une routine.

    En espérant avoir pu t'aider.

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2003
    Messages
    94
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2003
    Messages : 94
    Points : 53
    Points
    53
    Par défaut
    Je ne suis pas développeur, donc l'option JAVA je préfère la laisser de côté.

    Par contre avec un tMap je suis preneur, je sais faire avec un seul champs mais comment faire la même opération sur 453 champs ?

    Merci

  4. #4
    Modérateur
    Avatar de XxArchangexX
    Homme Profil pro
    Conseil - Consultant en systèmes d'information
    Inscrit en
    Mars 2012
    Messages
    1 159
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France

    Informations professionnelles :
    Activité : Conseil - Consultant en systèmes d'information
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Mars 2012
    Messages : 1 159
    Points : 2 323
    Points
    2 323
    Par défaut
    je viens de mieux comprendre, je suis étonné par un fichier à 435 champs ^_^. Vu comme ça même avec tMap tu devras définir le changement pour chaque champs, pour éviter de tout répéter effectivement une routine n'est pas mal.

    à voir si quand dans un csv la valeur est null il ne met pas "" comme valeur.

    une petite comme ça

    Code java : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    public String modifNull(String champ){
     
    if(champ.isEmpty() || "".equals(champ))
    champ = 'O';
     
    return champ;
    }

    mais il faut l'appliquer pour chaque champ, modifNull(row1.champ1) etc...

    n'ayant pas Talend sous la main, je vais réfléchir pour te dire s'il y a une méthode plus automatisé. A moins qu'une personne l'ai avant moi .

  5. #5
    Modérateur
    Avatar de XxArchangexX
    Homme Profil pro
    Conseil - Consultant en systèmes d'information
    Inscrit en
    Mars 2012
    Messages
    1 159
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France

    Informations professionnelles :
    Activité : Conseil - Consultant en systèmes d'information
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Mars 2012
    Messages : 1 159
    Points : 2 323
    Points
    2 323
    Par défaut
    je viens de mieux comprendre, je suis étonné par un fichier à 435 champs ^_^. Vu comme ça même avec tMap tu devras définir le changement pour chaque champ, pour éviter de tout répéter effectivement une routine est une bonne idée.

    à voir si quand dans un csv la valeur est null il ne met pas "" comme valeur.

    une petite comme ça

    Code java : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    public String modifNull(String champ){
     
    // si le champ est null ou si le champ = "", ne pas utiliser == dans une comparaison avec des objets car avec un == la comparaison est sur les adresses mémoires et non les valeurs
    if(champ.isEmpty() || "".equals(champ))
    champ ="O";
     
    return champ;
    }

    mais il faut l'appliquer pour chaque champ, modifNull(row1.champ1) etc...

    n'ayant pas Talend sous la main, je vais réfléchir pour te dire s'il y a une méthode plus automatisée. A moins qu'une personne ai une solution avant moi .

  6. #6
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2003
    Messages
    94
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2003
    Messages : 94
    Points : 53
    Points
    53
    Par défaut
    Merci pour ces premiers éléments, néanmoins cela reste fastidieux lorsque l'on a autant de champs ... Bref preneur de toutes astuces pour automatiser.

  7. #7
    Rédacteur
    Avatar de jsd03
    Homme Profil pro
    Conseil - Consultant en systèmes d'information
    Inscrit en
    Août 2008
    Messages
    1 221
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Activité : Conseil - Consultant en systèmes d'information

    Informations forums :
    Inscription : Août 2008
    Messages : 1 221
    Points : 6 506
    Points
    6 506
    Par défaut
    Dans tous les cas il faudra bien faire une action pour chaque champ même pour indiquer d'appliquer telle ou telle méthode.

    Donc à part appliquer une routine comme l'indique XxArchangexX tu n'auras à mon sens pas d'autres choix. L'avantage quand même de la routine c'est que si tu as une modification à faire à ta règle de gestion tu le feras une seule fois pour tous tes champs...

  8. #8
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2003
    Messages
    94
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2003
    Messages : 94
    Points : 53
    Points
    53
    Par défaut
    Pas très pratique tout de même...

    J'imagine une autre piste :
    1 - importer mon fichier csv A (avec 453 colonnes) comme une seule colonne
    2 - faire un ou plusieurs treplace pour nettoyer les données (remplacer tous les valeurs NULL par '0')
    3 - sauvegarder le résultat dans un fichier B csv
    4 - importer le fichier B en indiquant cette fois le caractère de séparation de colonne

    Pensez-vous cela jouable ? Est-ce optimisable ?

  9. #9
    Modérateur
    Avatar de XxArchangexX
    Homme Profil pro
    Conseil - Consultant en systèmes d'information
    Inscrit en
    Mars 2012
    Messages
    1 159
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France

    Informations professionnelles :
    Activité : Conseil - Consultant en systèmes d'information
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Mars 2012
    Messages : 1 159
    Points : 2 323
    Points
    2 323
    Par défaut
    Ton algo peut fonctionner mais en java (le langage derrière Talend) l'écriture lecture de fichier sur disque est la pire action pour l'optimisation. Deplus le mettre en place est un peu tordu car ce que tu demandes c'est un sorte de traitement dynamique du fichier et talend n'est pas vraiment fait pour cela.

    A paufiner et tester car je ne garantie pas le résultat mais tu dois pouvoir t'amuser avec ça si tu tiens à l'automatisation :

    - tJava Créer un fichier et stocker en variable globale l'objet pour écrire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    // le fichier final
    File fichier= new File("test")+"/"+TalendDate.formatDate("yyyy-MM-dd", TalendDate.getCurrentDate())+".txt");
     
    FileWriter fw = new FileWriter(fichier, true);
    // l objet pour écrire
    BufferedWriter output = new BufferedWriter(fw);
     
    // on le stocke pour plus tard
    GlobalMap.put("ecrivain",output);
    - tFileInputDelimited : ton .csv, la plupart des csv sont en séparateur ';' il me semble.

    - Pour être sûr tu peux faire un tFileOutputDelimited en .txt séparateur \t (tabulation).

    - un tFileInputFullRow sur le .txt (tu vas ainsi lire toutes les lignes de ton fichier)

    - tJavaRow ( on prend chaque ligne que l'on éclate sur le séparateur \t on obtient ainsi un tableau du fichier)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
     
    String ligne= ((String)input_row.line);
    // on split sur le séparateur du fichier :  "Tabulation"
    tabATraite = ligne.split("\t");
    ((BufferedWriter)GlobalMap.get("ecrivain").write(routine.verifEtModif(tabATraite))
    dans ta routine une boucle (for int i=0;i <= tabATraite .size();i++) pour traiter chaque case du tableau avec la condition de modification (if("".equals(tabATraite[i])) tabATraite[i] ="O").

    puis un return tabATraite

    tFileInputDelimited : pour lire le .txt généré.

    tFileOutputDelimited : pour écrire dans un fichier .csv ( tu auras ton fichier avec des O à la place des null ou des "") .

    Synthèse : Ainsi le job va créer un fichier avec un objet pour écrire -> transformer le .csv en .txt (tabulation) ->lire tout le fichier ligne par ligne -> exploser dans un tableau en mémoire -> effectuer la modification dans une routine -> écrire dans le fichier -> récupération du fichier.txt générer -> pour le mettre en .csv

    Tordu hein ^_^°. Mais tu as un traitement dynamique de ton fichier pour faire la modification et mettre des O partout ou le champ et vide.

    A voir pour optimisation et test mais ça devrait fonctionner et vu que le traitement est ligne par ligne ça ne consomme pas une mémoire folle, mais comme j'ai dit au début l'écriture dans le fichier peut prend un peu de temps.

  10. #10
    Membre régulier
    Profil pro
    Développeur informatique
    Inscrit en
    Mai 2009
    Messages
    50
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mai 2009
    Messages : 50
    Points : 72
    Points
    72
    Par défaut
    Bonjour,
    Sur Talendforge/exchange, tu as un composant tNulltoDefault qui fait ça tout seul.
    Voici l'url
    http://www.talendforge.org/exchange/...view&nav=2,1,1

    Pour l'importer dans Talend, il faut aller dans le menu Fenêtre -> Préférences
    Puis dans Talend -> Composant

    Tu renseignes le répertoire contenant ton composants (je te conseille de créer un répertoire dédié à cela ex : c:\talend\composants si tu es sous windows) Puis tu cliques sur le bouton Appliquer.
    Il est possible que tu es besoin de redémarrer Talend.
    Après l'import, tu retrouveras ton composant dans la rubrique Divers.

    Je l'ai importé et testé sur la version 5.2 et il fonctionne à merveille.

    Cordialement,
    Cédric.

Discussions similaires

  1. Rechercher/remplacer sur plusieurs champs
    Par Dropped_User dans le forum Langage SQL
    Réponses: 9
    Dernier message: 27/05/2014, 12h03
  2. [AC-2007] Regrouper, compter par plusieurs criteres sur plusieurs champs
    Par nubed dans le forum Requêtes et SQL.
    Réponses: 3
    Dernier message: 27/02/2014, 16h22
  3. [XSL] Filtre sur plusieurs champs par variable
    Par Skyou dans le forum XSL/XSLT/XPATH
    Réponses: 1
    Dernier message: 19/09/2012, 20h37
  4. Réponses: 2
    Dernier message: 19/11/2011, 13h21
  5. remplacé les null par zéro sur interbase
    Par lassmust dans le forum InterBase
    Réponses: 1
    Dernier message: 15/01/2007, 13h19

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