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 :

Découper un fichier texte positionnel ?


Sujet :

Développement de jobs

  1. #1
    Membre averti
    Femme Profil pro
    Étudiant
    Inscrit en
    Février 2015
    Messages
    29
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 31
    Localisation : France, Loire (Rhône Alpes)

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

    Informations forums :
    Inscription : Février 2015
    Messages : 29
    Par défaut Découper un fichier texte positionnel ?
    Bonjour à tous,

    J'aurais encore une fois besoin de votre aide.

    Je dois convertir des fichiers textes positionnels en XML. Pour cela j'utilise le job suivant, tFileInputPostional => tXMLMap (ou j’insère mon XML de référence) => tFileOutputXML.

    Seulement mes fichiers textes sont construits de la sorte:

    LigneA AAAAAAAAAAAAAAAAAAAAAAAAAAAA
    LigneB BBBBBBBBBBBBBBBBBBBBBBBBBBBB
    LigneC CCCCCCCCCCCCCCCCCCCCCCCCCCCC
    LigneA AAAAAAAAAAAAAAAAAAAAAAAAAAAA
    LigneB ...
    ....

    J'ai donc créer des métadonnées pour chaque type de ligne, ce qui me permet d'effectuer mon découpage du fichier pour mes données et ensuite je place ces métadonnées en référence dans mes tFileInputPositional pour que le job puisse s'adapter à d'autres fichiers. Seulement Talend ne fait pas la différence entre les différents types de lignes, il traite chaque ligne du fichier inséré sur tous les tFileInputPositional (qui contiennent un format de ligne différent) ce qui créer des énormes fichiers XML (ex: 5Go) et qui en plus sont faux.

    Ma question est donc comment faire pour traiter mes fichiers selon le type des lignes ? Est ce qu'il faut que je découpe mon fichier au préalable en rassemblant toutes les LigneA ensembles, LigneB ensembles etc... ou connaissez vous un autre moyen ?

    J’espère que j'ai été assez clair dans la description de mon problème.

    Par avance merci de vos réponses.

  2. #2
    Membre émérite Avatar de bstevy
    Homme Profil pro
    Solutions Architect
    Inscrit en
    Mai 2009
    Messages
    552
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : Japon

    Informations professionnelles :
    Activité : Solutions Architect
    Secteur : Finance

    Informations forums :
    Inscription : Mai 2009
    Messages : 552
    Par défaut
    Que penses tu d'intégrer ton fichier sur deux colonnes, une identifiant ton type de ligne, et l'autre le contenu de ta ligne (j'imagine de taille plus ou moins grande selon le type de ligne, donc prévoit la longueur max)
    A partir de la, tu filtres sur ton type de ligne, et chacun par dans un traitement different.

    Au final, soit tu sors chaque type de ligne dans un fichier, soit tu concatène dans ton fichier de sortie.

    Que penses tu de cette solution ?

  3. #3
    Membre averti
    Femme Profil pro
    Étudiant
    Inscrit en
    Février 2015
    Messages
    29
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 31
    Localisation : France, Loire (Rhône Alpes)

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

    Informations forums :
    Inscription : Février 2015
    Messages : 29
    Par défaut
    Quand tu parles de colonne c'est sur la métadonnée ? Oui mais si je met le type de ligne dans une colonne et son contenu dans une autre je ne pourrais pas effectuer de découpage sur le contenu ? Parce que dans le fichier XML je ne récupère pas tout le contenu, seulement quelques données qui m’intéresse sur la ligne.

  4. #4
    Membre émérite Avatar de bstevy
    Homme Profil pro
    Solutions Architect
    Inscrit en
    Mai 2009
    Messages
    552
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : Japon

    Informations professionnelles :
    Activité : Solutions Architect
    Secteur : Finance

    Informations forums :
    Inscription : Mai 2009
    Messages : 552
    Par défaut
    Je ne vois pas où est le problème.

    Tu fais un traitement en trois partie, un traitement pour tes lignes de type A, un pour tes lignes de type B et un pour tes lignes de type C.
    Tu récupères les morceaux qui t'interesses dans chacune de ces lignes. Et il te reste plus qu'a généré ton fichier xml.

    Si tu as besoin que les données A fassent référence à la ligne B suivante, il te faut alors numéroter tes lignes pour avoir un élément de jointure supplémentaire.

  5. #5
    Membre averti
    Femme Profil pro
    Étudiant
    Inscrit en
    Février 2015
    Messages
    29
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 31
    Localisation : France, Loire (Rhône Alpes)

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

    Informations forums :
    Inscription : Février 2015
    Messages : 29
    Par défaut
    Je suis désolé bstevy mais je n'arrive pas à comprendre ta solution, comment je fais pour mettre ma ligne dans 2 colonnes dans la métadonnée et en même temps faire un découpage selon la position des données ?
    Je ne comprend pas comment je peux récupérer les morceaux qui m'intéresse dans la colonne.

    Parce que pour l'instant j'ai crée une métadonnée pour un fichier positionnel pour chaque type de ligne en y insérant un fichier complet que je veux convertir et pour effectuer le découpage des données j'ai entré dans le séparateur de champs les positions de mes données ce qui ensuite me créer une colonne pour chaque donnée. Les autres lignes je les enlève grâce aux options en-tête et pied de page pour garder seulement la ligne qui m’intéresse et qui me servira de référence pour toute les lignes de ce type la. Je dois passer à coté de quelques chose ou alors je suis pas du tout sur la bonne voie, je débute encore sur Talend je ne connais pas grand chose.

    Merci pour ton aide.

  6. #6
    Membre émérite Avatar de bstevy
    Homme Profil pro
    Solutions Architect
    Inscrit en
    Mai 2009
    Messages
    552
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : Japon

    Informations professionnelles :
    Activité : Solutions Architect
    Secteur : Finance

    Informations forums :
    Inscription : Mai 2009
    Messages : 552
    Par défaut
    Non, mais c'est un peu ma faute, je simplifie trop les étapes

    Ok, donc, ce que je propose en fait, c'est une étape précédent ton étape de découpage.
    En gros, d'un point de vue positionnel, tu es capables de dire que du premier au X-ieme caractere, tu as un élément qui te permet d'identifier ta ligne.
    Et donc du X-ieme caractère à la fin de ton fichier, tu as le contenu de ta ligne.

    Ce que je te propose en terme de métadonnée, c'est donc ces deux "colonnes".
    Et derrière cela, tu as une nouvelle acquisition, qui peut se faire par exemple par l'intermédiaire du tMap directement, qui va te découper ta grosse ligne (la 2eme colonne créée précédement) pour qu'elle rentre dans ton modèle précédent.

    Si les métadonnées des lignes A B et C sont différentes, ca te permet en amont de diriger chaque ligne vers un traitement approprié et donc d'effectuer un découpage qui va bien plutôt que d'avoir un découpage commun pour chacune de tes lignes.

    Est ce que c'est plus clair? ou ca reste confu ?

  7. #7
    Membre averti
    Femme Profil pro
    Étudiant
    Inscrit en
    Février 2015
    Messages
    29
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 31
    Localisation : France, Loire (Rhône Alpes)

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

    Informations forums :
    Inscription : Février 2015
    Messages : 29
    Par défaut
    Oui c'est plus clair merci d'avoir reformulé
    Du coup en terme de Job ça donne : tFileInputPositional (avec la première métadonnée à 2 colonnes) => tMap (qui récupère juste les données) => tFileOuputPositional (qui sera donc une sorte de fichier temporaire pour "transporté" les données à mon job actuel) et cela pour chaque type de ligne. Parce que en sortie du tMap il n'y a pas de moyen pour le relier directement aux tFileInputPositional de mon job actuel ?
    J'ai bien compris ton idée cette fois ou il me manque encore quelques choses ?

    Je vais tester ça tout de suite pour voir ce que ça donne

  8. #8
    Membre émérite Avatar de bstevy
    Homme Profil pro
    Solutions Architect
    Inscrit en
    Mai 2009
    Messages
    552
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : Japon

    Informations professionnelles :
    Activité : Solutions Architect
    Secteur : Finance

    Informations forums :
    Inscription : Mai 2009
    Messages : 552
    Par défaut
    dans l'idée, c'est effectivement ca. sauf que le travail du tFileInputPositional doit pouvoir être réalisé avec un tMap ce qui pourrait éviter d'avoir à passer par un fichier plat intermédiaire.

    En plus, vous pouvez directement mettre trois sortie sur votre tMap chacun résultant d'un type de ligne particulier.

  9. #9
    Membre averti
    Femme Profil pro
    Étudiant
    Inscrit en
    Février 2015
    Messages
    29
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 31
    Localisation : France, Loire (Rhône Alpes)

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

    Informations forums :
    Inscription : Février 2015
    Messages : 29
    Par défaut
    J'ai donc essayé plusieurs choses, premièrement j'ai essayé la méthode avec le tMap et un tFileOutputpositional pour voir ce que j'arrivais à obtenir, j'ai bien les données mais les lignes que je ne veux pas utilisées apparaissent quand même dans le fichier de sortie, j'ai essayé de mettre des conditions dans le tMap mais il me sort des erreurs.
    Seconde chose, chaque ligne est dupliquée un bon nombre de fois (ex: une ligne qui apparaît une seule fois dans fichier d'entrée est présente 13 fois dans le fichier de sortie) je ne comprend pas d'où cela peut venir...

    Après j'ai essayé de relié directement le tMap sur le tFileInput car comme tu la dit ça serait préférable d'éviter de créer un fichier temporaire mais la connexion est impossible. J'ai donc essayé de mettre un composant intermédiaire entre les deux de type tSortRow et là, la seule connexion possible est avec un lien iterate mais Talend créer encore une erreur car il considère qu'il n'y a pas de fichier de sortie pour le tSortRow.

  10. #10
    Membre averti
    Femme Profil pro
    Étudiant
    Inscrit en
    Février 2015
    Messages
    29
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 31
    Localisation : France, Loire (Rhône Alpes)

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

    Informations forums :
    Inscription : Février 2015
    Messages : 29
    Par défaut
    Du coup j'ai réussi à découper mon fichier sans avoir de doublons en sortie, pour cela j'ai utilisé un filtre dans le tMap pour trier les lignes selon le type A, B ou C. Si ça peut aider quelqu'un j'ai utilisé: row1.Column0.contains("LigneA"). Par contre j'ai été obligé de créer un fichier temporaire, je n'ai pas trouvé comment faire pour relier le tMap directement sur un tFileInput...

    Merci bstevy pour ton aide, je pense au pouce vert cette fois

  11. #11
    Membre émérite Avatar de bstevy
    Homme Profil pro
    Solutions Architect
    Inscrit en
    Mai 2009
    Messages
    552
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : Japon

    Informations professionnelles :
    Activité : Solutions Architect
    Secteur : Finance

    Informations forums :
    Inscription : Mai 2009
    Messages : 552
    Par défaut
    Le petit point que tu n'as pas compris dans mon explication je pense, c'est qu'il ne faut pas relié le tmap au tinputfile, car c'est impossible.
    Il faut faire en sorte que la sortie de ton tmap soit la même que celle de ton tinputfile, à savoir, découpé en plusieur colonne. Il faut que tu "réalises" l'étape tinputfile avec le tmap. pas que tu les relies.

  12. #12
    Membre averti
    Femme Profil pro
    Étudiant
    Inscrit en
    Février 2015
    Messages
    29
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 31
    Localisation : France, Loire (Rhône Alpes)

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

    Informations forums :
    Inscription : Février 2015
    Messages : 29
    Par défaut
    Oui j'ai compris mais je ne sais pas comment je peux effectuer le découpage de ma colonne "données" directement dans le tMAP.
    La j'ai un tFileInput avec la métadonnée à deux colonnes comme tu me l'avais conseillé et dans le tMAP je trie les lignes avec le filtre que j'ai marqué plus haut mais je ne vois pas comment rajouter dans le tMAP le découpage de ma colonne selon le nombres de caractères qui compose un champs..

  13. #13
    Membre émérite Avatar de bstevy
    Homme Profil pro
    Solutions Architect
    Inscrit en
    Mai 2009
    Messages
    552
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : Japon

    Informations professionnelles :
    Activité : Solutions Architect
    Secteur : Finance

    Informations forums :
    Inscription : Mai 2009
    Messages : 552
    Par défaut
    Il faut aller regarder dans les fonctions de manipulation de string, un truc du genre substring.

  14. #14
    Membre averti
    Femme Profil pro
    Étudiant
    Inscrit en
    Février 2015
    Messages
    29
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 31
    Localisation : France, Loire (Rhône Alpes)

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

    Informations forums :
    Inscription : Février 2015
    Messages : 29
    Par défaut
    Cette méthode ne fonctionne pas dans mon cas car substring prend les caractères qu'on lui indique et supprime tout le reste. Or j'ai besoin que toute la ligne soit transmise et seulement déclarer la position de mes champs sur la ligne, tel que le fait la métadonnée. J'ai fait d'autres recherches, pour l'instant j'ai rien trouvé qui me permette de faire ce que je veux. Je vais poursuivre avec la méthode que j'utilise pour le moment vu que ça marche. Et puis si jamais quelqu'un à une autre idée ....

    Encore merci bstevy.

  15. #15
    Membre émérite Avatar de bstevy
    Homme Profil pro
    Solutions Architect
    Inscrit en
    Mai 2009
    Messages
    552
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : Japon

    Informations professionnelles :
    Activité : Solutions Architect
    Secteur : Finance

    Informations forums :
    Inscription : Mai 2009
    Messages : 552
    Par défaut
    A partir d'un seul champ en entrée dans ton tmap, tu peux faire plusieur champ en sortie, et utiliser autant de substring qu'il te faut.
    Par exemple, si ta ligne est
    tototititata
    tu peux créer trois champ de sortie du genre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    champ1 -> substring(maLigne,1,4)
    champ2 -> substring(maLigne,5,4)
    champ3 -> substring(maLigne,9,4)
    un truc dans le genre. ce qui revient au meme que ton découpage positionnel précédent.

  16. #16
    Membre averti
    Femme Profil pro
    Étudiant
    Inscrit en
    Février 2015
    Messages
    29
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 31
    Localisation : France, Loire (Rhône Alpes)

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

    Informations forums :
    Inscription : Février 2015
    Messages : 29
    Par défaut
    Ca marche j'ai réussi à donner une position à tous mes champs, hier j'ai fais une erreur sur les paramètres pour définir la taille du champs dans le tMAP.
    Par contre j'ai utilisé la methode substring comme ça : row5.Column0.substring(0, 6) parce que substring(maLigne,1,4) Talend sort une erreur comme quoi la méthode n'est pas définie.

    Nom : txtXML.jpg
Affichages : 1508
Taille : 67,2 Ko

    Au final j'obtiens ceci, le tfileouputpositional1 remplace ma 1ere métadonnée et il faut que je remplace la tinpupositional3 par le deuxième toutputpositional seulement le tXMLMAP n'accepte pas le lien lookup
    Mais même comme ça j'aurais un fichier qui ce créera pour chaque ligne, je ne vois pas quel composant utiliser pour éviter d'avoir un fichier temporaire.

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

Discussions similaires

  1. Découper un fichier texte
    Par Kreepz dans le forum VB.NET
    Réponses: 12
    Dernier message: 17/07/2014, 09h05
  2. [2008] Découper un fichier texte avec séparateur ";"
    Par Daniel MOREAU dans le forum MS SQL Server
    Réponses: 6
    Dernier message: 10/04/2014, 17h17
  3. Réponses: 2
    Dernier message: 14/12/2009, 11h36
  4. [Batch] Découper un fichier texte
    Par brolon dans le forum Scripts/Batch
    Réponses: 0
    Dernier message: 31/03/2009, 16h06
  5. Découper un fichier texte
    Par idalloul dans le forum Entrée/Sortie
    Réponses: 3
    Dernier message: 07/10/2008, 10h27

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