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 09/02/2011, 11h24   #1
Membre du Club
 
Inscription : mars 2007
Messages : 248
Détails du profil
Informations forums :
Inscription : mars 2007
Messages : 248
Points : 46
Points : 46
Par défaut [TDQ 4.1.1] Talend lecture feuille (sheet) tFileInputExcel avec expression regulière

Bonjour
Dans Talend data Quality (interface dev. idem que TOS] je voudrais définir une expression régulière afin de commencer la lecture de mon fichier Excel à partir de 4ème feuille.
Et ... je n'y arrive pas.
Pour indiquer la position de la feuille, j'utilise : //([3-9]|[0-9]+)//, mais cela ne marche pas.
La ligne java est
Code :
     sheetList_tFileInputExcel_2.addAll(regexUtil_tFileInputExcel_2.getSheets(workbook_tFileInputExcel_2, //([3-9]|[0-9]+)//, true));
Ceci donne l'erreur de syntaxe à la compilation

Je crois que c'est un problème d'utilisation de "\" ou "\\" ou ...
Faut-il mettre des guillemets, slashes, antislashes ?

Je n'arrive même pas à lui dire bêtement de lire les feuilles : 4, 5, 6 avec l'expression suivante: \\[345]\\.
Cela donne aussi des erreurs de syntaxe.

Merci d'avance de votre aide
msomso
msomso est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/02/2011, 11h27   #2
Membre extrêmement actif
 
Avatar de jojodu31
 
Inscription : mars 2008
Messages : 870
Détails du profil
Informations personnelles :
Localisation : France, Haute Garonne (Midi Pyrénées)

Informations forums :
Inscription : mars 2008
Messages : 870
Points : 733
Points : 733
Bonjour,
pour les guillemets c'est sur qu'il les faut. Après je ne connais pas assez les regex pour t'aider plus... mais double les \\ si tu as besoin d'en mettre
__________________
Heureux soient les fêlés, car ils laisseront passer la lumière.

Mieux vaut fermer sa gueule et passer pour un con que l'ouvrir et ne laisser aucun doute à ce sujet.
jojodu31 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/02/2011, 11h56   #3
Membre du Club
 
Inscription : mars 2007
Messages : 248
Détails du profil
Informations forums :
Inscription : mars 2007
Messages : 248
Points : 46
Points : 46
J'ai l'impression qu'en mettant les ", il s'attend à un nom et non au nombre=position de la feuille.
msomso est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/02/2011, 12h05   #4
Membre extrêmement actif
 
Avatar de jojodu31
 
Inscription : mars 2008
Messages : 870
Détails du profil
Informations personnelles :
Localisation : France, Haute Garonne (Midi Pyrénées)

Informations forums :
Inscription : mars 2008
Messages : 870
Points : 733
Points : 733
Passe en mode Source et regarde ce qu'attend la méthode getSheets comme type de paramètres. Tu sauras si tu dois mettre un entier, une chaine et si c est le cas est ce que c est le nom de la feuille (je pense que c est le cas) ou est ce une Regex.
__________________
Heureux soient les fêlés, car ils laisseront passer la lumière.

Mieux vaut fermer sa gueule et passer pour un con que l'ouvrir et ne laisser aucun doute à ce sujet.
jojodu31 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/02/2011, 14h11   #5
Membre du Club
 
Inscription : mars 2007
Messages : 248
Détails du profil
Informations forums :
Inscription : mars 2007
Messages : 248
Points : 46
Points : 46
Je ne connais pas Java, comment "passer en mode Source" ?

Cependant en indiquant juste un numéro "en dur" (par exemple 3 sans côtes/guillemets/etc) cela fonctionne.
Donc la fonction doit gérer les 2 types de paramètres, je crois.

J'arrive à utiliser les REGEX pour les noms de feuilles, mais j'aurais voulu pouvoir indiquer la position initiale au lieu d'exclure les noms de 3 premières feuilles.
msomso est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/02/2011, 14h34   #6
atb
Membre chevronné
 
Homme
Inscription : novembre 2004
Messages : 569
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 28
Localisation : Autre

Informations forums :
Inscription : novembre 2004
Messages : 569
Points : 696
Points : 696
Lorsque tu utilise un inputExcel voilà ce que talend génère comme code pour récupérer les sheets :

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
class RegexUtil_tFileInputExcel_1 {
 
					public java.util.List<jxl.Sheet> getSheets(
							jxl.Workbook workbook, String oneSheetName,
							BOOLEAN useRegex) {
 
						java.util.List<jxl.Sheet> list = new java.util.ArrayList<jxl.Sheet>();
 
						IF (useRegex) {// this part process the regex issue
 
							jxl.Sheet[] sheets = workbook.getSheets();
							java.util.regex.Pattern pattern = java.util.regex.Pattern
									.compile(oneSheetName);
							FOR (int i = 0; i < sheets.length; i++) {
								String sheetName = sheets[i].getName();
								java.util.regex.Matcher matcher = pattern
										.matcher(sheetName);
								IF (matcher.matches()) {
									jxl.Sheet sheet = workbook
											.getSheet(sheetName);
									IF (sheet != NULL) {
										list.ADD(sheet);
									}
								}
							}
 
						} else {
							jxl.Sheet sheet = workbook.getSheet(oneSheetName);
							IF (sheet != NULL) {
								list.ADD(sheet);
							}
 
						}
 
						RETURN list;
					}
 
					public java.util.List<jxl.Sheet> getSheets(
							jxl.Workbook workbook, int INDEX, BOOLEAN useRegex) {
						java.util.List<jxl.Sheet> list = new java.util.ArrayList<jxl.Sheet>();
						jxl.Sheet sheet = workbook.getSheet(INDEX);
						IF (sheet != NULL) {
							list.ADD(sheet);
						}
						RETURN list;
					}
 
				}
Soit tu lui passe en paramètre le nom de la feuille (string ou expression régulière)

Soit l’index de la feuille (entier)

Pour l’expression régulière tu peux faire En regardant de près le code, je ne crois pas que Talend itére sur l’index de la feuille. La méthode getSheets prend soit un index ou un string (nom ou expression régulière)
atb est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/02/2011, 08h50   #7
Membre du Club
 
Inscription : mars 2007
Messages : 248
Détails du profil
Informations forums :
Inscription : mars 2007
Messages : 248
Points : 46
Points : 46
Bonjour
Non, avec expression proposée "^(3|4)" j'ai:
Citation:
Exception in component tFileInputExcel_1
java.lang.RuntimeException: Special sheets not exist!
Pour confirmer ma supposition, j'ai créé une feuille nommée "3" et une autre nommée "4as".
Avec l'expression "^(3|4)" il ne trouve que la feuille du nom "3".
Avec l'expression "^(3|4)[a-z]*" il trouve les 2 feuilles du nom "3" et "4as".

Mais comment obtenir la lecture à partir de la N-ième feuille ?
Comment passer un nombre avec une REGEX ?

Je crois qu'il ne faut pas utiliser de guillemets
En passant REGEX (sans "") :
(3|4), il m'ouvre la feuille N°7 (en comptant 0,1,2,..., 7)
(1|4), il m'ouvre la feuille N°5 (en comptant 0,1,2,..., 5)
Le code java est :
Code :
1
2
3
				java.util.List<jxl.Sheet> sheetList_tFileInputExcel_1 = new java.util.ArrayList<jxl.Sheet>();
				sheetList_tFileInputExcel_1.addAll(regexUtil_tFileInputExcel_1
						.getSheets(workbook_tFileInputExcel_1, (1 | 4), true));
Pourquoi ferait-il la somme?
Ou trouver le codesource de la fonction "getSheets" ?

D'avance merci
msomso
msomso est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/02/2011, 09h20   #8
Membre du Club
 
Inscription : mars 2007
Messages : 248
Détails du profil
Informations forums :
Inscription : mars 2007
Messages : 248
Points : 46
Points : 46
Bonjour
D'après le support Talend il n'est pas possible d'utiliser REGEX pour les numéros de feuilles:
http://="http://www.talendforge.org/...=51049#p51049"

Merci
msomso
msomso est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/02/2011, 09h37   #9
Membre extrêmement actif
 
Avatar de jojodu31
 
Inscription : mars 2008
Messages : 870
Détails du profil
Informations personnelles :
Localisation : France, Haute Garonne (Midi Pyrénées)

Informations forums :
Inscription : mars 2008
Messages : 870
Points : 733
Points : 733
Pour te répondre malgré tout, quand tu fais :
Tu fais un OU binaire via l'opérateur | (pipe). Si tu as fait un peu de calcul binaire tu sais que 3 | 4 => 7 car 3=011 en binaire, et 4 = 100, donc le OU te renvoies 111 soit 7 !

Voilou
__________________
Heureux soient les fêlés, car ils laisseront passer la lumière.

Mieux vaut fermer sa gueule et passer pour un con que l'ouvrir et ne laisser aucun doute à ce sujet.
jojodu31 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/02/2011, 09h41   #10
atb
Membre chevronné
 
Homme
Inscription : novembre 2004
Messages : 569
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 28
Localisation : Autre

Informations forums :
Inscription : novembre 2004
Messages : 569
Points : 696
Points : 696
L'utilisation de l'opérateur | est un OR exlusive
Code :
1
2
 
Retourne 1 si l'un ou l'autre des deux bits de même poids est à 1 (ou les deux)
Exemple
Code :
 9 | 12 (1001 | 1100)  retourne	13 (1101)
Sinon la méthode getsheet s'attend à un entier dans le cas d'un index. Tu ne peux pas lui transmettre un tableau ou faire une boucle. Du moins avec ce composant. Essaye ça dans le numéro de la feuille Talend te sortira l'erreur comme quoi aucune méthode getsheet ne prend un int[] (tableau de int) en paramètre.
Maintenant je ne pense pas qu'on puisse boucler sur un tableau au moment d'appeler la méthode. Java ne le permet pas à ma connaissance.

Mais tu peux toujours utiliser le composant tloop par exemple avec une variable N° feuille. Et tu la passe en paramètre à ton inputExcel. Mais cela induit d'ouvrir le fichier autant de fois que lire les onglets...
atb est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/02/2011, 09h46   #11
Membre extrêmement actif
 
Avatar de jojodu31
 
Inscription : mars 2008
Messages : 870
Détails du profil
Informations personnelles :
Localisation : France, Haute Garonne (Midi Pyrénées)

Informations forums :
Inscription : mars 2008
Messages : 870
Points : 733
Points : 733
Citation:
Envoyé par atb Voir le message
L'utilisation de l'opérateur | est un OR exlusive
Si je peux me permettre ce n'est pas un OR exclusif, un OR exclusif renvoie 0 pour 1 | 1
__________________
Heureux soient les fêlés, car ils laisseront passer la lumière.

Mieux vaut fermer sa gueule et passer pour un con que l'ouvrir et ne laisser aucun doute à ce sujet.
jojodu31 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/02/2011, 10h42   #12
Membre du Club
 
Inscription : mars 2007
Messages : 248
Détails du profil
Informations forums :
Inscription : mars 2007
Messages : 248
Points : 46
Points : 46
Bonjour
Merci pour vos explications.
La solution avec tLoop est intéressante et suggérée aussi par le support Talend. Son inconvénient est qu'il faut connaître d'avance le nombre de feuilles à traiter. Dans notre cas le nombre de feuilles sera variable, donc cela nous oblige à gérer un paramètre supplémentaire.

Pour le moment, j'ouvre mon fichier avec l'option "Toutes les feuilles" et j'exclue les 3 premières. L'inconvénient, c'est que Talend lis les lignes vides dans chaque feuilles, il faut donc un filtre supplémentaire pour les exclure.
L'option "Terminer la lecture sur ligne vide" doit être désactivée pour passer à la feuille suivante.

msomso
msomso est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 06h18.


 
 
 
 
Partenaires

Hébergement Web