Accueil / Blog / Métier / 2014 / Talend Tutoriel - Générer un fichier VCARD de ses contacts

Talend Tutoriel - Générer un fichier VCARD de ses contacts

Par Gaël Pegliasco publié 10/03/2014, édité le 11/11/2015
Un exercice amusant et bien utile m'a été demandé dernièrement lors d'une formation Talend Data Integration : Comment générer des VCARD avec Talend depuis un fichier CSV/Excel ou autre ? TOS for Data Integration est un outil très riche et il y offre de nombreuses façons de réaliser ce type de travail. Cet article vous en présente 2. L'une en utilisant le composant tJavaFlex, l'autre avec le composant tSplitRow.

Analyse du problème

Nous disposons de données tabulaires (CSV, Excel, Requête SQL, peu importe).

Dans cet article nous utiliserons un fichier CSV généré par le composant Talend tRowGenerator. Mais vous trouverez bien quelques données issues de votre CRM ou ERP favori et dont vous aimeriez bien pouvoir disposer sur votre smartphone.

Le but est de générer une VCARD pour chacun des contacts.
Exemple de données sources:

NOM ; PRENOM, TEL ; VILLE
DURAND ; PIERRE ; 0102030405 ; PARIS
DUPOND ; SIDONIE ; 0203040506 ; MARS

Une VCARD est décrite par un ensemble de lignes au format texte, comme présenté dans cet article de Wikipedia ou sur le site du W3C :

BEGIN:VCARD
VERSION:3.0
N:Gump;Forrest
FN:Forrest Gump
ORG:Bubba Gump Shrimp Co.
TITLE:Shrimp Man
PHOTO;VALUE=URL;TYPE=GIF:http://www.example.com/dir_photos/my_photo.gif
TEL;TYPE=WORK,VOICE:(111) 555-1212
TEL;TYPE=HOME,VOICE:(404) 555-1212
ADR;TYPE=WORK:;;100 Waters Edge;Baytown;LA;30314;United States of America
LABEL;TYPE=WORK:100 Waters Edge\nBaytown, LA 30314\nUnited States of America
ADR;TYPE=HOME:;;42 Plantation St.;Baytown;LA;30314;United States of America
LABEL;TYPE=HOME:42 Plantation St.\nBaytown, LA 30314\nUnited States of America
EMAIL;TYPE=PREF,INTERNET:forrestgump@example.com
REV:20080424T195243Z
END:VCARD

Le format a évolué au fil des années et existe dans plusieurs versions.
La version 2.1 est supportée par la grande majorité des clients emails (thunderbird, outlook, …)
La version 3 est aujourd'hui très répandue et supportée par la majorité des logiciels de messagerie et appareils mobiles. Elle est définie par les RFC 2425 et 2426.
Une version 4 est définie par la RFC 6350 mais reste moins répandue. Enfin une version XML, xCard, existe aussi.

Nous partirons sur la génération d'une VCARD dans la version 3.0 de ce format de données qui reste moderne et largement répandu.

Cet exercice présente 2 difficultés :

  1. Générer plusieurs lignes en sortie pour une ligne d'enregistrement en entrée.
  2. Choisir le type de fichier pour enregistrer les données produites.

Concernant le point 1 il y a plusieurs solutions qui peuvent-être mises en œuvre via Talend :

  • Les jointures entre flux permettent de générer plusieurs lignes en sortie pour un enregistrement donné en le croisant avec d'autres informations :
    Par exemple, en croisant les données, personnes et gâteaux, nous aurions assurément plusieurs enregistrements retournés par la questions « Quels sont les gâteaux que j'aime ? »
    Nous pourrions alors imaginer faire une jointure entre la liste des contacts et la liste des tags/mots-clefs du format VCARD.
    Pour cela nous utiliserions une source supplémentaire de données listant les tags du format VCARD que nous associerions via un tMap à la liste des contacts.
  • Nous pourrions aussi « casser » la ligne en plusieurs lignes: une par champ présent dans l'enregistrement contact. Le composant tSplitRow permet cette utilisation. Nous la retiendrons dans cet article.
  • Avec une approche « langage de programmation » nous pourrions stocker l'ensemble du texte produit pour chaque contact dans un buffer et enregistrer le contenu de ce dernier dans un fichier texte une fois toutes les VCARD générées. Nous retiendrons aussi cette solution.
  • Et il y en a sûrement plein d'autres...

Concernant le choix du fichier de sortie. Les composants de type tFileOutput<Quelquechose> sauvegardent généralement des informations séquentiellement, enregistrement par enregistrement. Dans notre première solution basée sur le tSplitRow cela ferait notre affaire : le format VCARD est de la forme <TAG> : <VALEUR>. Nous pourrions utiliser un fichier délimité par le caractère « : ».

Dans le second cas il faudrait écrire notre buffer directement dans un fichier texte. Soit nous le faisons avec un composant Java, soit avec le composant tFileOutputRaw nouvellement arrivé dans Talend 5.4 et pas encore documenté. Ce sera l'occasion de le découvrir !

Le fichier source utilisé pour les jobs peut être téléchargé depuis ce lien.

Version tSplitRow

vcard1_job.png

Le composant « fichier_contacts » est de type tFileInputDelimited et fait référence au fichier « dummy-contacts.csv ». Son schéma est le suivant, n'oubliez pas d'indiquer qu'il contient une entête sur la ligne 1.

 vcard1_csv_in.png

Nous nous attarderons plus sur le composant tSplitRow.

Ce composant permet de scinder une ligne d'enregistrement en plusieurs.
Par exemple vous pouvez lui dire que chaque ligne d'enregistrement du fichier de données :

NOM1;PRENOM1;VILLE1;NOM2;PRENOM2;VILLE2
D1;P1;V1;D2;P2;V2
D3;P3;V3;D4;P4;V4

Se décompose finalement comme suit :

NOM;PRENOM;VILLE
D1;P1;V1
D2;P2;V2
D3;P3;V3
D4;P4;V4

Nous allons procéder de la sorte pour lui indiquer que notre ligne d'enregistrement des contacts se décompose en plusieurs lignes, une par TAG de la VCARD.
N'oublions pas qu'une VCARD a une structure de lignes ayant la forme TAG:VALEUR
Nous allons donc modifier le schéma de sortie du tSplitRow en conséquent.

vcard1_split.png

Puis nous devons maintenant indiquer au tSplitRow comment décomposer la ligne entrante afin de générer l'ensemble des tags de la VCARD pour chaque enregistrement reçu du tFileInputDelimited.
Saisissez dans la zone « Mapping des colonnes » les tags devant être générés et la façon de « calculer » leurs valeurs respectives :

vcard1_split2.png

Le caractère « : » de séparation sera indiqué dans le fichier de sortie du tFileOutputDelimited :

vcard1_out.png
Il ne vous reste plus qu'à exécuter le job pour obtenir le fichier .VCF

BEGIN:VCARD 
VERSION:3.0
N:Cleveland;Gerald
FN:Gerald Cleveland
ORG:Talend Inc.
TEL;TYPE=WORK,VOICE:09.94.73.14
EMAIL;INTERNET:cleveland.gerald@talend.com
ADR;TYPE=WORK:;;Cerrillos Road;34440;Montpelier
LABEL;TYPE=WORK:Cerrillos Road\n34440\nMontpelier
END:VCARD
BEGIN:VCARD
VERSION:3.0
N:Washington;Harry
FN:Harry Washington
ORG:Talend Inc.
TEL;TYPE=WORK,VOICE:09.57.79.38
EMAIL;INTERNET:washington.harry@talend.com
ADR;TYPE=WORK:;;East 1st Street;22576;Raleigh
LABEL;TYPE=WORK:East 1st Street\n22576\nRaleigh
END:VCARD

Version tJavaFlex

Dans cette version nous vous proposons de remplacer le composant tSplitRow par un composant tJavaFlex.
L'idée n'est plus d'enregistrer le texte des VCARD au fur et à mesure du traitement de chaque contact, mais de stocker cette information dans un buffer puis d'enregistrer le contenu du buffer dans un fichier.

vcard2_job.png
Le premier composant reste inchangé par rapport à la version utilisant de tSplitRow. Je vous invite donc à récupérer sa configuration par copier/coller du précédent job.

Le tJavaFlex réalise 2 tâches :

Dans le code initial, le buffer est créé.
Nous stockons le buffer dans une entrée nommée VCARD_CONTENT du globalMap ; il est ainsi partagé avec tous les composants.
Dans le code principal nous construisons le texte de la VCARD pour le contact courant en l'ajoutant au buffer.

vcard2_flex.png

Le tJavaFlex ne génère pas de lignes en sortie, vous n'êtes pas obligés de lui fournir un schéma en sortie.
Dans l'exemple de code ci-dessus, la VCARD a été simplifiée au maximum afin que le code Java tienne dans la capture d'écran et aussi parce que je suis peu fainéant en cette fin d'article.
Le composant final, tFileOutputRaw prend en entrée un champ nommé « content » de type « Object ». C'est en fait le contenu du fichier.

Il faut donc lui transmettre une unique ligne de données avec un champ nommé « content ».

Pour cela nous utilisons le composant tFixedFlowInput qui permet de générer un nombre fini de données selon un schéma lui aussi défini par vos soins. Il est très utile pour décrire de petites listes de valeurs que vous ne voulez pas stocker dans une base, comme une liste de couleurs, de statuts ou autres.
Voici sa configuration :
vcard2_fixed.png

Il suffit ensuite de renseigner le champ « content » de l'unique ligne de données générée avec le buffer issu du globalMap :


vcard2_fixed2.png
Enfin, le schéma du tFileOutputRaw qui est normalement inchangé.


vcard2_out.png

Et maintenant, exécutons le job :

VCARD:BEGIN 
VERSION:3.0
FN:Gerald Cleveland
TEL;TYPE=WORK,VOICE:09.94.73.14
ORG: Talend Inc.
VCARD:END
VCARD:BEGIN
VERSION:3.0
FN:Harry Washington
TEL;TYPE=WORK,VOICE:09.57.79.38
ORG: Talend Inc.
VCARD:END

Il ne vous reste plus qu'à télécharger le fichier généré sur votre smartphone ou l'importer dans votre messagerie.

En espérant que cela vous aura aidé dans la sélection de vos contacts quotidiens... Sinon n'oubliez pas notre formation Talend et proposez-nous votre exercice !

ABONNEZ-VOUS À LA NEWSLETTER !
Voir aussi
Makina Corpus devient partenaire Gold de Talend Makina Corpus devient partenaire Gold de Talend 12/05/2009

Talend Tutoriel : comprendre les connexions iterate 20/12/2013

Le lien iterate est décrit assez succinctement dans le manuel utilisateur de Talend (User Guide). ...

Préparez votre agenda de formation pour la rentrée ! Préparez votre agenda de formation pour la rentrée ! 21/12/2015

Drupal8, PostgreSQL, Python scientifique... Découvrez nos nouvelles formations et les dernières ...

Geocoder avec Talend Open Studio 22/05/2014

Mettre en place un job de geocodage d'adresses (depuis un fichier XLS) dans l'ETL Talend Open ...

Makina Corpus participe à la conférence mondiale sur OpenStreetMap Makina Corpus participe à la conférence mondiale sur OpenStreetMap 09/09/2019

Du 21 au 23 septembre se tient à Heidelberg, en Allemagne, la douzième conférence annuelle sur ...