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 27/01/2012, 11h48   #1
Invité de passage
 
Femme
Conseil - Consultant en systèmes d'information
Inscription : juillet 2011
Messages : 19
Détails du profil
Informations personnelles :
Sexe : Femme

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

Informations forums :
Inscription : juillet 2011
Messages : 19
Points : 2
Points : 2
Par défaut Conversion date talend en TimeStamp

Bonjour,

Pour commencer, je vous préviens que je suis débutant, et sans formation, sur Talend.

Je souhaite intégrer un flux RSS en base (MySQL) dans le quel le champs PUBDATE est au format String (ex: 30 Nov 2011 01:22:49 GMT).
Mon objectif est d'en tirer le format timestamp qui est celui de la table visée.
Cependant, je ne vois pas de convertisseur préfabriqué.
Comment puis-je obtenir ce résultat là ?

J'en suis actuellement rendu à l'obtention d'un string au format 30-11-2011 01:22:49 avec :
Code :
TalendDate.formatDateLocale("dd-MM-yyyy HH:mm:ss",TalendDate.parseDateLocale("dd MMM yyyy HH:mm:ss 'GMT'",row1.PUBDATE,"EN"),"EN")
Je vous remercie par avance.
Aerial est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/01/2012, 14h03   #2
Membre habitué
 
Etienne Menuet
Inscription : mai 2010
Messages : 75
Détails du profil
Informations personnelles :
Nom : Etienne Menuet
Localisation : France, Paris (Île de France)

Informations forums :
Inscription : mai 2010
Messages : 75
Points : 103
Points : 103
Bonjour,

Il n'y a pas de type timestamp dans Talend.

Donc tu lis ta colonne source PUBDATE en String et tu la convertie en Date avec les fonctions Talend Date que tu maitrises ou en utilisant le composant tConvertType
Le composant tMysqlOutput fera la conversion entre le type Date Java et timestamp Mysql.
emenuet est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/01/2012, 14h48   #3
Invité de passage
 
Femme
Conseil - Consultant en systèmes d'information
Inscription : juillet 2011
Messages : 19
Détails du profil
Informations personnelles :
Sexe : Femme

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

Informations forums :
Inscription : juillet 2011
Messages : 19
Points : 2
Points : 2
Bonjour,
Et merci !

J'ai utilisé la méthode que vous m'indiquez .. mais j'ai droit à une erreur :
Impossible de convertir de Date en Int
Aerial est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/01/2012, 15h55   #4
Membre Expert
 
Avatar de haskouse
 
Homme Mustapha EL HASSAK
Ingénieur développement logiciels
Inscription : août 2009
Messages : 628
Détails du profil
Informations personnelles :
Nom : Homme Mustapha EL HASSAK
Âge : 26
Localisation : Maroc

Informations professionnelles :
Activité : Ingénieur développement logiciels
Secteur : Finance

Informations forums :
Inscription : août 2009
Messages : 628
Points : 1 515
Points : 1 515
Salut,

J'ai fait un test et ça marche chez moi.
Pour cela j'ai utilisé la routine suivante :

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
public static Date stringToDateTrois(String date) {
        IF (date == NULL || date.equals(""))
            RETURN NULL;
 
        date = TalendDate.formatDateLocale("dd-MM-yyyy HH:mm:ss",TalendDate.parseDateLocale("dd MMM yyyy HH:mm:ss 'GMT'",date,"EN"),"EN");
 
        SimpleDateFormat df = new SimpleDateFormat("dd-MM-yyyy HH:mm:ss");
        try {
            Date res = df.parse(date);
            RETURN res;
        } catch (ParseException e) {
            e.printStackTrace();
            RETURN NULL;
        }
    }
Et dans le tMap j'ai mis ça :
Code :
Conversion.stringToDateTrois(row2.PUBDATE)
Pour la création de routine c'est très facile je te renvoi vers ce tuto : http://haskouse.developpez.com/tutor...ation-routine/
__________________
Le savant qui enseigne le bien aux gens et ne le met pas en pratique, est semblable à la torche qui éclaire en se brûlant. "Mohammed le Messager d’Allah" (que la paix et le salut d'Allah soient sur lui)

Mes articles publiés
haskouse est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 30/01/2012, 09h28   #5
Invité de passage
 
Femme
Conseil - Consultant en systèmes d'information
Inscription : juillet 2011
Messages : 19
Détails du profil
Informations personnelles :
Sexe : Femme

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

Informations forums :
Inscription : juillet 2011
Messages : 19
Points : 2
Points : 2
Merci pour cette réponse !

Je testerai ça dans le courant de la journée et ne manquerai pas de revenir vers vous pour clore ou relancer la discussion.

EDIT :
J'ai copié/collé le bout de code dans ma nouvelle routine :

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
package routines;
 
public static Date stringToDateTrois(String date) {
    IF (date == NULL || date.equals(""))
        RETURN NULL;
 
    date = TalendDate.formatDateLocale("dd-MM-yyyy HH:mm:ss",TalendDate.parseDateLocale("dd MMM yyyy HH:mm:ss 'GMT'",date,"EN"),"EN");
 
    SimpleDateFormat df = new SimpleDateFormat("dd-MM-yyyy HH:mm:ss");
    try {
        Date res = df.parse(date);
        RETURN res;
    } catch (ParseException e) {
        e.printStackTrace();
        RETURN NULL;
    }
}
Bien que, malgré mes faibles compétences de Java, le code me parait propre, j'ai droit aux erreurs que vous trouverez en PJ.
Images attachées
Type de fichier : png ErreurMaRoutine.png (21,1 Ko, 4 affichages)
Aerial est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 30/01/2012, 11h17   #6
Membre Expert
 
Avatar de haskouse
 
Homme Mustapha EL HASSAK
Ingénieur développement logiciels
Inscription : août 2009
Messages : 628
Détails du profil
Informations personnelles :
Nom : Homme Mustapha EL HASSAK
Âge : 26
Localisation : Maroc

Informations professionnelles :
Activité : Ingénieur développement logiciels
Secteur : Finance

Informations forums :
Inscription : août 2009
Messages : 628
Points : 1 515
Points : 1 515
Est ce que tu peux envoyer le code complet de ta routine ?
__________________
Le savant qui enseigne le bien aux gens et ne le met pas en pratique, est semblable à la torche qui éclaire en se brûlant. "Mohammed le Messager d’Allah" (que la paix et le salut d'Allah soient sur lui)

Mes articles publiés
haskouse est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 30/01/2012, 11h23   #7
Invité de passage
 
Femme
Conseil - Consultant en systèmes d'information
Inscription : juillet 2011
Messages : 19
Détails du profil
Informations personnelles :
Sexe : Femme

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

Informations forums :
Inscription : juillet 2011
Messages : 19
Points : 2
Points : 2
Heu ...

Le code complet est ci dessus, dans mon précédent message.
J'ai simplement (et bêtement) copié/collé le code initial ...
Aerial est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 30/01/2012, 11h30   #8
Membre Expert
 
Avatar de haskouse
 
Homme Mustapha EL HASSAK
Ingénieur développement logiciels
Inscription : août 2009
Messages : 628
Détails du profil
Informations personnelles :
Nom : Homme Mustapha EL HASSAK
Âge : 26
Localisation : Maroc

Informations professionnelles :
Activité : Ingénieur développement logiciels
Secteur : Finance

Informations forums :
Inscription : août 2009
Messages : 628
Points : 1 515
Points : 1 515
il te faut la partie class dans ta classe de routine.
Essai de coller ce code complet dans ta routine. (tu modifieras le nom de la classe par le nom de la routine que tu as créé).

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
public class Nom_De_LaRoutine_A_mettre_ICI {/**
     * stringToDateTrois: return date.
     * 
     * 
     * {talendTypes} String
     * 
     * {Category} Conversion
     * 
     * {param} string("19930401") input: The string needed to be converted.
     * 
     * {example} stringToDate("19930401") # La date : 01 Avril 1993.
     */
    public static Date stringToDateTrois(String date) {
        IF (date == NULL || date.equals(""))
            RETURN NULL;
 
        date = TalendDate.formatDateLocale("dd-MM-yyyy HH:mm:ss",TalendDate.parseDateLocale("dd MMM yyyy HH:mm:ss 'GMT'",date,"EN"),"EN");
 
        SimpleDateFormat df = new SimpleDateFormat("dd-MM-yyyy HH:mm:ss");
        try {
            Date res = df.parse(date);
            RETURN res;
        } catch (ParseException e) {
            e.printStackTrace();
            RETURN NULL;
        }
    }
}
Dans le code ci-dessus, tu remplaces 'IF' , 'RETURN' et 'NULL' par leur équivalent en minuscule.
__________________
Le savant qui enseigne le bien aux gens et ne le met pas en pratique, est semblable à la torche qui éclaire en se brûlant. "Mohammed le Messager d’Allah" (que la paix et le salut d'Allah soient sur lui)

Mes articles publiés
haskouse est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 30/01/2012, 12h42   #9
Invité de passage
 
Femme
Conseil - Consultant en systèmes d'information
Inscription : juillet 2011
Messages : 19
Détails du profil
Informations personnelles :
Sexe : Femme

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

Informations forums :
Inscription : juillet 2011
Messages : 19
Points : 2
Points : 2
Citation:
Envoyé par emenuet Voir le message
Le composant tMysqlOutput fera la conversion entre le type Date Java et timestamp Mysql.
La routine est bien opérationnelle et marche très bien, merci @Haskouse

Par contre, lors de l'import dans ma table MySQL, j'ai l'erreur suivante :
Code :
DATA truncated FOR COLUMN 'cdate' at row 1
Dans mon TMap j'ai bien forcé le type de cdate en date au format "dd-MM-yyyy HH:mm:ss" comme me renvoie la routine de Haskouse.
Le champ 'cdate' est, lui, en Int dans ma table.
Aerial est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 30/01/2012, 13h07   #10
Membre Expert
 
Avatar de haskouse
 
Homme Mustapha EL HASSAK
Ingénieur développement logiciels
Inscription : août 2009
Messages : 628
Détails du profil
Informations personnelles :
Nom : Homme Mustapha EL HASSAK
Âge : 26
Localisation : Maroc

Informations professionnelles :
Activité : Ingénieur développement logiciels
Secteur : Finance

Informations forums :
Inscription : août 2009
Messages : 628
Points : 1 515
Points : 1 515
Normalement le type de la colonne cible (sur MySQL) est de type timeStamp dans la BD et de type Date sur le schéma Talend, pourquoi tu dis qu'il est de type Int ?
__________________
Le savant qui enseigne le bien aux gens et ne le met pas en pratique, est semblable à la torche qui éclaire en se brûlant. "Mohammed le Messager d’Allah" (que la paix et le salut d'Allah soient sur lui)

Mes articles publiés
haskouse est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 30/01/2012, 13h33   #11
Invité de passage
 
Femme
Conseil - Consultant en systèmes d'information
Inscription : juillet 2011
Messages : 19
Détails du profil
Informations personnelles :
Sexe : Femme

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

Informations forums :
Inscription : juillet 2011
Messages : 19
Points : 2
Points : 2
Dans la table, dont je ne suis pas l'auteur, le type du champs est Int, dans lequel la date est stockée en timestamp ...

Je vais me débrouiller dans la routine pour calculer la valeur de la date en timestamp et retourner un Int ...
Aerial est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 30/01/2012, 14h39   #12
Membre Expert
 
Avatar de haskouse
 
Homme Mustapha EL HASSAK
Ingénieur développement logiciels
Inscription : août 2009
Messages : 628
Détails du profil
Informations personnelles :
Nom : Homme Mustapha EL HASSAK
Âge : 26
Localisation : Maroc

Informations professionnelles :
Activité : Ingénieur développement logiciels
Secteur : Finance

Informations forums :
Inscription : août 2009
Messages : 628
Points : 1 515
Points : 1 515
A vrai dire je ne connais pas très bien la base MySql, mais comment un champs de type date peut il être stocker dans un colonne Int sous forme d'un TimeStamp ??
__________________
Le savant qui enseigne le bien aux gens et ne le met pas en pratique, est semblable à la torche qui éclaire en se brûlant. "Mohammed le Messager d’Allah" (que la paix et le salut d'Allah soient sur lui)

Mes articles publiés
haskouse est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 30/01/2012, 15h12   #13
Invité de passage
 
Femme
Conseil - Consultant en systèmes d'information
Inscription : juillet 2011
Messages : 19
Détails du profil
Informations personnelles :
Sexe : Femme

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

Informations forums :
Inscription : juillet 2011
Messages : 19
Points : 2
Points : 2
Ben j'avoue que je suis dépassé par le truc mais comme dit précédemment j'en suis pas l'auteur, et je ne peut me permettre de changer le type du champs de la table.

Mais a titre d'exemple :
Dans le champs j'ai pour valeur : 1326788354
Qui correspond à la date 17/1/2012 à 9:19:14

La personne qui à conçu la table a jugé bon de typé le champs en Int ... malgré le type timestamp existant ...
Aerial est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 30/01/2012, 15h28   #14
Membre Expert
 
Avatar de haskouse
 
Homme Mustapha EL HASSAK
Ingénieur développement logiciels
Inscription : août 2009
Messages : 628
Détails du profil
Informations personnelles :
Nom : Homme Mustapha EL HASSAK
Âge : 26
Localisation : Maroc

Informations professionnelles :
Activité : Ingénieur développement logiciels
Secteur : Finance

Informations forums :
Inscription : août 2009
Messages : 628
Points : 1 515
Points : 1 515
Essai avec cette fonction :

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
public static long stringToDateTrois(String date) {
        IF (date == NULL || date.equals(""))
            RETURN 0;
 
        date = TalendDate.formatDateLocale("dd-MM-yyyy HH:mm:ss",TalendDate.parseDateLocale("dd MMM yyyy HH:mm:ss 'GMT'",date,"EN"),"EN");
 
        SimpleDateFormat df = new SimpleDateFormat("dd-MM-yyyy HH:mm:ss");
        try {
            Date res = df.parse(date);
            RETURN res.getTime();
        } catch (ParseException e) {
            e.printStackTrace();
            RETURN 0;
        }
    }
Dans le schéma au niveau de Talend tu mettras ta colonne de sortie en type long et regarde si MySql va accepter les données.
__________________
Le savant qui enseigne le bien aux gens et ne le met pas en pratique, est semblable à la torche qui éclaire en se brûlant. "Mohammed le Messager d’Allah" (que la paix et le salut d'Allah soient sur lui)

Mes articles publiés
haskouse est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 30/01/2012, 15h30   #15
Membre émérite
 
Homme Nicolas Saumande
Architecte Décisionnel
Inscription : février 2008
Messages : 693
Détails du profil
Informations personnelles :
Nom : Homme Nicolas Saumande
Âge : 36
Localisation : France, Haute Garonne (Midi Pyrénées)

Informations professionnelles :
Activité : Architecte Décisionnel

Informations forums :
Inscription : février 2008
Messages : 693
Points : 879
Points : 879
Bonjour,

Est-ce que ça ne serait pas une valeur qui serait du genre le nombre de secondes écoulées depuis le premier janvier 1970...
Il me semble que c'est pas mal utilisé dans les applis PHP.

Voici comme j'ai traité le cas, en modifiant la requête qui récupère les valeurs :

Code :
  str_to_date('19700101', '%Y%m%d') + INTERVAL `MaTable`.`MaDate` SECOND
Nicolas
DevNico est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 30/01/2012, 15h59   #16
Invité de passage
 
Femme
Conseil - Consultant en systèmes d'information
Inscription : juillet 2011
Messages : 19
Détails du profil
Informations personnelles :
Sexe : Femme

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

Informations forums :
Inscription : juillet 2011
Messages : 19
Points : 2
Points : 2
Il s'agit effectivement d'un appli en php, et du nombre de seconde écoulée depuis le 01/01/1970

Par contre je ne vois pas comment mettre en oeuvre ton bout de code ...
Aerial est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 30/01/2012, 16h32   #17
Membre émérite
 
Homme Nicolas Saumande
Architecte Décisionnel
Inscription : février 2008
Messages : 693
Détails du profil
Informations personnelles :
Nom : Homme Nicolas Saumande
Âge : 36
Localisation : France, Haute Garonne (Midi Pyrénées)

Informations professionnelles :
Activité : Architecte Décisionnel

Informations forums :
Inscription : février 2008
Messages : 693
Points : 879
Points : 879
Si j'ai bien suivi, ta problématique est l'inverse de la mienne : tu souhaites alimenter un champ qui stock un timestamp sous la forme d'un entier.

Il faut donc que tu calcules la valeur de cet entier à partir de ton timestamp qui est sous la forme d'une date.
Et ce calcul doit retourner le nombre de secondes entre ta date et le 1er janvier 1970, minuit.

Je pense que tu peux faire cela en utilisant la fonction Talend : TalendDate.diffDate(myDate,myDate2,"ss")
(Le "ss" à la fin indique que tu veux le résultat en seconde)
Dans le myDate, tu mets le 1er janvier 1970, et dans le myDate2, tu mets ta date.

Nicolas
DevNico est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 30/01/2012, 16h33   #18
Invité de passage
 
Femme
Conseil - Consultant en systèmes d'information
Inscription : juillet 2011
Messages : 19
Détails du profil
Informations personnelles :
Sexe : Femme

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

Informations forums :
Inscription : juillet 2011
Messages : 19
Points : 2
Points : 2
Citation:
Envoyé par haskouse Voir le message
Essai avec cette fonction :

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
public static long stringToDateTrois(String date) {
        IF (date == NULL || date.equals(""))
            RETURN 0;
 
        date = TalendDate.formatDateLocale("dd-MM-yyyy HH:mm:ss",TalendDate.parseDateLocale("dd MMM yyyy HH:mm:ss 'GMT'",date,"EN"),"EN");
 
        SimpleDateFormat df = new SimpleDateFormat("dd-MM-yyyy HH:mm:ss");
        try {
            Date res = df.parse(date);
            RETURN res.getTime();
        } catch (ParseException e) {
            e.printStackTrace();
            RETURN 0;
        }
    }
Dans le schéma au niveau de Talend tu mettras ta colonne de sortie en type long et regarde si MySql va accepter les données.
Merci, ça m'a l'air en bonne voie .. si je test en écrivant dans un excel, j'ai bien une chaîne numérique qui ressemble à ce que je veux.
Par contre c'est codé sur 13 caractères, contre 10 dans ma base, les 3 caractère en plus n'étant que des 0.
Aerial est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 30/01/2012, 16h45   #19
Invité de passage
 
Femme
Conseil - Consultant en systèmes d'information
Inscription : juillet 2011
Messages : 19
Détails du profil
Informations personnelles :
Sexe : Femme

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

Informations forums :
Inscription : juillet 2011
Messages : 19
Points : 2
Points : 2
Problème résolu !!

Voici le code que j'utilise et qui fonctionne :
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
package routines;
 
import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.sql.Timestamp; 
 
public class ConvertDateToIntASTimeStamp {/**
     * stringToDateTrois: return date.
     * 
     * 
     * {talendTypes} String
     * 
     * {Category} Conversion
     * 
     * {param} string("19930401") input: The string needed to be converted.
     * 
     * {example} stringToDate("19930401") # La date : 01 Avril 1993.
     */
    public static long stringToDateTrois(String date) {
    	IF (date == NULL || date.equals(""))
        RETURN 0;
 
    date = TalendDate.formatDateLocale("dd-MM-yyyy HH:mm:ss",TalendDate.parseDateLocale("dd MMM yyyy HH:mm:ss 'GMT'",date,"EN"),"EN");
 
    SimpleDateFormat df = new SimpleDateFormat("dd-MM-yyyy HH:mm:ss");
    try {
        Date res = df.parse(date);
/** Division par 1000 pour avoir le résultat en secondes et non millisecondes. **/
        long resultat = res.getTime()/1000;
        RETURN resultat;
            } catch (ParseException e) {
        e.printStackTrace();
        RETURN 0;
    }
}
}
Merci à tous ceux qui ont participé à la résolution de mon problème.
Aerial 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 16h52.


 
 
 
 
Partenaires

Hébergement Web