Précédent   Forum des professionnels en informatique > Logiciels > Solutions d'entreprise > Business Intelligence > ETL > Talend
Talend Forum d'entraide sur Talend (Talend Open Studio, ...). Avant de poster --> FAQ Talend, Tutoriels Talend
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 25/10/2011, 16h15   #1
Membre Expert
 
Homme Alexis
Intégrateur d'Exploitation
Inscription : février 2003
Messages : 876
Détails du profil
Informations personnelles :
Nom : Homme Alexis
Âge : 32
Localisation : France

Informations professionnelles :
Activité : Intégrateur d'Exploitation
Secteur : Biens de consommation

Informations forums :
Inscription : février 2003
Messages : 876
Points : 1 619
Points : 1 619
Envoyer un message via ICQ à Alek-C Envoyer un message via Skype™ à Alek-C
Par défaut Réutiliser première ligne fichier

Bonjour,

je suis en train de découvrir Talend (version : Talend Integration Suite Professional Edition 4.2.3).

J'ai encore un peu du mal à faire mes marques avec le nombre impressionnant d'outils disponibles et l'orientation Dev par rapport à d'autres ETL

Bref, je suis actuellement en train de trouver la meilleure méthode pour faire un truc tout c*n, mais je ne suis pas satisfait du résultat, je voulais donc avoir vos avis éclairés !

J'ai des fichiers toto_<id>.txt de style csv
Chaque fichier peut commencer par un ligne avec 4 valeurs sinon, il commencera par une ligne avec une seule colonne; il se terminera également avec une ligne composée d'une seule colonne. Les lignes normales des fichiers comportant 3 colonnes.
Je veux parcourir tous ces fichiers, et sortir un fichier résultat comportant l'ensemble des lignes "normales" des fichiers, précédées du terme <id> et des éventuelles valeurs des 4 colonnes de la première ligne (si elle existe, du vide sinon).

Exemple:
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
toto_truc1.txt
1;2;3;4
11:00
01/01/2011;123456789;99
01/01/2011;987654321;33
01/01/2011;246813579;66
11:00
 
toto_truc2.txt
11:00
02/01/2011;123456789;88
02/01/2011;987654321;22
02/01/2011;246813579;44
11:00
 
resultat.txt
truc1;1;2;3;4;01/01/2011;123456789;99
truc1;1;2;3;4;01/01/2011;987654321;33
truc1;1;2;3;4;01/01/2011;246813579;66
truc2;;;;;02/01/2011;123456789;88
truc2;;;;;02/01/2011;987654321;22
truc2;;;;;02/01/2011;246813579;44
Pour info, j'ai fait le script en perl, ça prend 15 lignes (donc je peux le poster si c'est plus clair pour expliquer).

Le problème que je rencontre, c'est de réutiliser les informations que j’extraie.
Par exemple, je commence par un tFileList pour récupérer la liste des fichiers. Je sors avec 2 liens d'itération. Le premier va vers un tFileProperties suivi d'un tExtractRegexFields qui me permettent d'obtenir l'id d'un fichier.
Le second lien d'itération part ves un tFileInputDelimited qui découpe les lignes en fonction des ;. Puis, un tMap réparti les lignes en fonction du nombre de champs : je sépare donc mes "entêtes" des mes lignes de données.
Mais là, je suis un peu bloqué sur quoi faire de tout ça

Donc si quelqu'un a une piste (n'hésitez pas à tout reprendre : je n'ai peut-être pas utilisé les bons outils dés le départ !).

Merci d'avance.
Alek-C est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 25/10/2011, 16h45   #2
Membre Expert
 
Homme Alexis
Intégrateur d'Exploitation
Inscription : février 2003
Messages : 876
Détails du profil
Informations personnelles :
Nom : Homme Alexis
Âge : 32
Localisation : France

Informations professionnelles :
Activité : Intégrateur d'Exploitation
Secteur : Biens de consommation

Informations forums :
Inscription : février 2003
Messages : 876
Points : 1 619
Points : 1 619
Envoyer un message via ICQ à Alek-C Envoyer un message via Skype™ à Alek-C
Ah, et j'ai oublié un détail... en fait, un fichier peut aussi être découpé au milieu

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
toto_truc3.txt
1;2;3;4
11:00
01/01/2011;123456789;99
01/01/2011;987654321;33
01/01/2011;246813579;66
11:00
2;4;6;8
12:00
03/01/2011;123456789;99
03/01/2011;987654321;33
03/01/2011;246813579;66
12:00
Alek-C est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/10/2011, 11h43   #3
Membre Expert
 
Homme Alexis
Intégrateur d'Exploitation
Inscription : février 2003
Messages : 876
Détails du profil
Informations personnelles :
Nom : Homme Alexis
Âge : 32
Localisation : France

Informations professionnelles :
Activité : Intégrateur d'Exploitation
Secteur : Biens de consommation

Informations forums :
Inscription : février 2003
Messages : 876
Points : 1 619
Points : 1 619
Envoyer un message via ICQ à Alek-C Envoyer un message via Skype™ à Alek-C
Bon, après pas mal de tâtonnement, je m'auto-réponds

Donc la solution que j'ai retenue et qui me semble pas mal :

Code :
tFileList -- iterate --> tFileInputDelimited -- main --> tMap -- main --> tFileOutput
C'était aussi simple que ça !

Le seul passage un peu compliqué, c'est dans le tMap : j'ai défini 2 booléens qui détectent quand je suis sur une ligne d'entête (4 champs) ou une ligne de données (3 champs).
Puis j'ai 4 variables qui mémorisent les valeurs lues sur les lignes d'entête quand je suis sur une ligne d'entête ou qui réstituent ces valeurs mémorisées quand je suis sur une autre ligne (du type Var.headerRow?row4.col1:Var.headerData1).
Ensuite, en sortie, j'ai quelques fonctions pour récupérer les données comme l'id du fichier (en utilisant (String)globalMap.get("tFileList_1_CURRENT_FILE")) et puis pour formater le tout...

C'est pas mal Talend, c'est pas mal !
Alek-C est déconnecté   Envoyer un message privé Réponse avec citation 10
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 12h24.


 
 
 
 
Partenaires

Hébergement Web