Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#1 Le 02/09/2020, à 18:46

arieugon

Conversion de fichiers CSV vers VCARD [résolu]

Bonjour à tous.
À beaucoup d'occasions on nous demande un fichier Vcard pour transférer nos contacts. Ce format de fichier n'est pas trivial. voir https://fr.wikipedia.org/wiki/VCard
J'ai cherché pour trouver sur internet quelque chose. Mais ne trouvant rien de satisfaisant j'ai créer moi-même un script qui fait le
job à partir d'un fichier CSV (voir les commentaires dans le script pour voir le format).
Je vous donne le code que vous pouvez coller dans votre éditeur préféré et le sauvegarder sous le nom Convertir_CSV_VCARD.
Il faut ensuite donner les droits d’exécution pour que ce script puisse fonctionner. Il faut utiliser la commande chmod :
moi@mamachine$ chmod 750 Convertir_CSV_VCARD

Le code

#!/bin/bash

#==============================================================================
#   Ce script a été développé par Jean-Louis NOGUEIRA (jl.nogueira@gmx.fr)
#   Le 2 septembre 2020
#   Si vous souhaitez le modifier, l'améliorer, le diffuser vous pouvez
#   le faire sans aucune limite.
#   Il n'est peut-être pas parfait.
#   Je vous demanderais juste de préciser mon nom comme étant celui qui
#   a produit ce script initial.   
#==============================================================================

#------------------------------------------------------------------------------
# Entête du fichier cvs : 
# firstname;name;NOTE;TELhome;TELcell;TELwork;road;code;town;TITLE;BDAY;MAIL
# 
# firstname = Prénom
# name      = Nom
# NOTE      = Information quelconque
# TELhome   = Téléphone domicile
# TELcell   = Téléphone portable
# TELwork   = Téléphone travail
# road      = Rue
# code      = Code postal
# town      = Ville
# TITLE     = Profession
# BDAY      = Jour de naissance au format AAAAMMJJ
# MAIL      = Adresse eMail
# 
# Pour Créer automatiquement cette entête utiliser l'option -c MonFichier.csv
# 
# moi@monOrdi$ Convertir_CSV_VCARD -c Monfichier.csv
#------------------------------------------------------------------------------

#------------------------------------------------------------------------------
# Structure du fichier vCard : 
# C'est une suite de carte de visite de chaque personne dont le format de
# sortie sera le suivant :  
#
# BEGIN:VCARD
# VERSION:4.0
# FN:Jean DUPONT
# TEL;TYPE=home,voice;VALUE=uri:tel:0123456789 
# TEL;TYPE=cell,voice;VALUE=uri:tel:0612645678
# TEL;TYPE=work,voice;VALUE=uri:tel:0123456789
# ADR;TYPE=HOME;LABEL="1 rue Machin\n75000 PARIS"
# TITLE:Informaticien
# BDAY:19902501
# MAIL:jean.dupont@gmx.com
# NOTE:Informations divers
# END:VCARD
#
# Pour davantage de détais consulter le site :https://fr.wikipedia.org/wiki/VCard
#------------------------------------------------------------------------------ 

#------------------------------------
# Définition des CONSTANTES
#------------------------------------
# Les champs
SEPARATEUR=";"
CHAMP01=firstname
CHAMP02=name
CHAMP03=NOTE
CHAMP04=TELhome
CHAMP05=TELcell
CHAMP06=TELwork
CHAMP07=road
CHAMP08=code
CHAMP09=town
CHAMP10=TITLE
CHAMP11=BDAY
CHAMP12=MAIL
# Les noms des fichiers
CVS_FILE=$2
VCARD_FILE=$3

#----------------
# Afficher l'aide
#----------------
AfficherAide(){
   echo -e "\
Ce script de conversion de fichier *.csv en vcard permet :
   1) De créer l'entête du fichier CSV quivous permettra de réaliser (sous    
      libreoffice ou tout autre logiciel permettant de créer des fichiers excel)
      facilement un fichier CSV en utilisant 'Sauvegarder sous' et choisir
      format 'csv' avec comme séparateur le caractère ';'.
      Dans ce  cas il faut indiquer l'option -c suivi  du nom du fichier  que
      vous voulez créer. 
      exemple : Convertir_CSV_VCARD -c monfichier.csv
      
   2) Lorsque vous avez un fichier CSV conforme au format nécessaire défini
      dans ce script, vous pouvez produire un fichier VCARD qui contient tous
      les contacts issus de votre fichier CSV.
      Pour cela il faut passer l'option -v suivi du nom du fichier CSV et de 
      votre fichier VCARD que vous voulez créer.
      exemple : Convertir_CSV_VCARD -v monfichier.csv mon_fichier_vcard
   
   3) L'option -h passé à ce script affiche l'aide.
      
   Vous pouvez modifier ce programme à votre guise. Pour l'améliorer, l'adapter
   ou pour tout autre raison.
   "
}

#------------------------------------
# Création de l'entête du fichier CSV
#------------------------------------
function CreerEnteteCSV(){
  echo "\
${CHAMP01}${SEPARATEUR}\
${CHAMP02}${SEPARATEUR}\
${CHAMP03}${SEPARATEUR}\
${CHAMP04}${SEPARATEUR}\
${CHAMP05}${SEPARATEUR}\
${CHAMP06}${SEPARATEUR}\
${CHAMP07}${SEPARATEUR}\
${CHAMP08}${SEPARATEUR}\
${CHAMP09}${SEPARATEUR}\
${CHAMP10}${SEPARATEUR}\
${CHAMP11}${SEPARATEUR}\
${CHAMP12}" > ${CVS_FILE}
}



#--------------------------
# Création du fichier VCARD
#--------------------------
function CreerVcard(){
n==1
while read line; do   
   if [ n == 1 ] 
      then 
         # pour sauter la ligne d'entête
         n+=n+1 
   else
      awk -F\; '{print \
"BEGIN:VCARD\n" \
"VERSION:4.0\n" \
"FN:"$1" "$2"\n" \
"TEL;TYPE=home,voice;VALUE=uri:tel:" $4 "\n" \
"TEL;TYPE=cell,voice;VALUE=uri:tel:" $5 "\n" \
"TEL;TYPE=work,voice;VALUE=uri:tel:" $6 "\n" \
"ADR;TYPE=HOME;LABEL="$7 " " $8 " " $9 "\n" \
"TITLE:"$10"\n" \
"BDAY:"$11"\n" \
"MAIL:"$12"\n" \
"NOTE:"$3"\n" \
"END:VCARD"}'
   fi
done < ${CVS_FILE} > ${VCARD_FILE} 
}

#--------------------
# Programme principal
#--------------------
case "$1" in
   -c)
      if [ $2 != "" ]; then
         AfficherAide
      else
         CreerEnteteCSV
      fi
   ;;
   -v)
      if [ $2 != "" ]; then
         if [ $3 != "" ]; then
            CreerVcard
         else
            AfficherAide   
         fi
      else
         AfficherAide
      fi
   ;;
   -h)
      AfficherAide   
   ;;
   *)
      AfficherAide
   ;;
esac 

Dernière modification par arieugon (Le 02/09/2020, à 19:09)


Portable ASUS K73E :  Ubuntu XFCE 20.04 / Ubuntu DDE 20.04 / Debian 10 /Debian 11 (testing) / Devuan 3
Le tout en multi-boot Grub Legacy.

Hors ligne

#2 Le 02/09/2020, à 18:56

arieugon

Re : Conversion de fichiers CSV vers VCARD [résolu]

Erreur

Dernière modification par arieugon (Le 02/09/2020, à 19:23)


Portable ASUS K73E :  Ubuntu XFCE 20.04 / Ubuntu DDE 20.04 / Debian 10 /Debian 11 (testing) / Devuan 3
Le tout en multi-boot Grub Legacy.

Hors ligne

#3 Le 02/09/2020, à 19:14

Watael

Re : Conversion de fichiers CSV vers VCARD [résolu]

salut,

on reprend pour ceux qui n'auraient pas suivi :
- par convention, seules les variables d'environnement doivent être tout en majuscules.
les variables utilisateur peuvent, elles, être pAnaChées.
- les accolades ne sont indispensables QUE s'il y a quelque chose d'accolé
- bash dispose de tableaux pour éviter de numéroter les variables :listeChamps( prenom nom ... )

( IFS=$separateur; echo "${listeChamps[*]}" ) >fichier

autrement :
- un awk pour faire un print !?
noooon! help printf.
- parce que read peut lire les lignes en créant un tableau.

#   Je vous demanderais juste de préciser mon nom comme étant celui qui
#   a produit ce script initial.

oh oui ! parce qu'il faut absolument qu'on sache qui a écrit ça.

PS :
et il existe une commande pour gérer les options d'un script
et les fonctions prennent des arguments, comme les scripts
etc.

PS 2 : CVS ≠ CSV

PS 3 :

CVS_FILE=$1

mais

case "$1" in
    -c) ...

comment est-ce possible ?

Dernière modification par Watael (Le 05/03/2021, à 18:05)


Connected \o/
Welcome to sHell. · eval is evil.

Hors ligne

#4 Le 30/09/2020, à 16:46

arieugon

Re : Conversion de fichiers CSV vers VCARD [résolu]

Merci Watael pour toutes tes remarques.
Je ne suis pas un spécialiste d'écriture de script. J'ai juste chercher sans trouver un script qui puisse faire cette conversion, et je ne suis pas le seul.
J'ai été voir le traitement de tableau, et la commande printf que tu suggères.
Mais il me semble que c'est plus simple et plus lisible avec la commande "awk".
Si tu es d'accord montre moi comment tu aurais traité ce problème.
Cordialement.


Portable ASUS K73E :  Ubuntu XFCE 20.04 / Ubuntu DDE 20.04 / Debian 10 /Debian 11 (testing) / Devuan 3
Le tout en multi-boot Grub Legacy.

Hors ligne

#5 Le 30/09/2020, à 17:01

bruno

Re : Conversion de fichiers CSV vers VCARD [résolu]

[HS]Tous les courrielleurs permettent d'importer du CSV et d'exporter du Vcard. Et lycée de Versailles.[/HS]

Hors ligne

#6 Le 30/09/2020, à 17:50

kholo

Re : Conversion de fichiers CSV vers VCARD [résolu]

+1 à Bruno... thunderbird sait le faire en tout cas...
... et je crois qu'il traine des scripts qui font ça sur le net...
je dois avoir ça dans ma bibliothèque... je regarderai à l'occasion...

j'ai tout de même mis le nez dans le script...
je n'ai pas fait toutes les recommandations de Watael mais une partie...
j'ajouterai que j'ai viré deux termes "function" qui sont obsolètes bien que fonctionnels...
#!/bin/env bash à la place de #!/bin/bash

j'ai rétablie les variables en minuscule
j'ai fait un tableau pour CHAMP qui est devenu le_champ (j'ai choisi le saut de ligne mais ça fonctionne avec des espaces)
du coup j'ai commencé l'accès aux éléments de le_champ à 0 et donc termine à 11 au lieu de 12 !
j'ai virer quelques sauts de lignes...

petites fotes :
'quivous' il manque juste l'espace...
détais => détails

le mail en clair dans le script n'est pas une bonne idée
(et même avec at ou chez, je pense que les robots ont passé ce stade depuis longtemps... mais bon...)

si je ne me trompe il reste la gestion des arguments et awk à voir...

#!/bin/env bash

#==============================================================================
#   Ce script a été développé par Jean-Louis NOGUEIRA (jl.nogueira chez gmx.fr)
#   Le 2 septembre 2020
#   Si vous souhaitez le modifier, l'améliorer, le diffuser vous pouvez
#   le faire sans aucune limite.
#   Il n'est peut-être pas parfait.
#   Je vous demanderais juste de préciser mon nom comme étant celui qui
#   a produit ce script initial.
#   modification kholo 2020 09 30 000
#==============================================================================

#------------------------------------------------------------------------------
# Entête du fichier cvs : 
# firstname;name;NOTE;TELhome;TELcell;TELwork;road;code;town;TITLE;BDAY;MAIL
# 
# firstname = Prénom
# name      = Nom
# NOTE      = Information quelconque
# TELhome   = Téléphone domicile
# TELcell   = Téléphone portable
# TELwork   = Téléphone travail
# road      = Rue
# code      = Code postal
# town      = Ville
# TITLE     = Profession
# BDAY      = Jour de naissance au format AAAAMMJJ
# MAIL      = Adresse eMail
# 
# Pour Créer automatiquement cette entête utiliser l'option -c MonFichier.csv
# 
# moi@monOrdi$ Convertir_CSV_VCARD -c Monfichier.csv
#------------------------------------------------------------------------------

#------------------------------------------------------------------------------
# Structure du fichier vCard : 
# C'est une suite de carte de visite de chaque personne dont le format de
# sortie sera le suivant :  
#
# BEGIN:VCARD
# VERSION:4.0
# FN:Jean DUPONT
# TEL;TYPE=home,voice;VALUE=uri:tel:0123456789 
# TEL;TYPE=cell,voice;VALUE=uri:tel:0612645678
# TEL;TYPE=work,voice;VALUE=uri:tel:0123456789
# ADR;TYPE=HOME;LABEL="1 rue Machin\n75000 PARIS"
# TITLE:Informaticien
# BDAY:19902501
# MAIL:jean.dupont@gmx.com
# NOTE:Informations divers
# END:VCARD
#
# Pour davantage de détails consulter le site :https://fr.wikipedia.org/wiki/VCard
#------------------------------------------------------------------------------ 

#------------------------------------
# Définition des CONSTANTES
#------------------------------------
# Les champs
le_separateur=";"
le_champ=(firstname
name
NOTE
TELhome
TELcell
TELwork
road
code
town
TITLE
BDAY
MAIL)
# Les noms des fichiers
csv_file=$2
vcard_file=$3

#----------------
# Afficher l'aide
#----------------
AfficherAide(){
echo -e "\
Ce script de conversion de fichier *.csv en vcard permet :
   1) De créer l'entête du fichier CSV qui vous permettra de réaliser (sous    
      libreoffice ou tout autre logiciel permettant de créer des fichiers excel)
      facilement un fichier CSV en utilisant 'Sauvegarder sous' et choisir
      format 'csv' avec comme séparateur le caractère ';'.
      Dans ce  cas il faut indiquer l'option -c suivi  du nom du fichier  que
      vous voulez créer. 
      exemple : Convertir_CSV_VCARD -c monfichier.csv
      
   2) Lorsque vous avez un fichier CSV conforme au format nécessaire défini
      dans ce script, vous pouvez produire un fichier VCARD qui contient tous
      les contacts issus de votre fichier CSV.
      Pour cela il faut passer l'option -v suivi du nom du fichier CSV et de 
      votre fichier VCARD que vous voulez créer.
      exemple : Convertir_CSV_VCARD -v monfichier.csv mon_fichier_vcard
   
   3) L'option -h passé à ce script affiche l'aide.
      
   Vous pouvez modifier ce programme à votre guise. Pour l'améliorer, l'adapter
   ou pour tout autre raison.
   "
}

#------------------------------------
# Création de l'entête du fichier CSV
#------------------------------------
CreerEnteteCSV(){
echo "\
${le_champ[0]}$le_separateur\
${le_champ[1]}$le_separateur\
${le_champ[2]}$le_separateur\
${le_champ[3]}$le_separateur\
${le_champ[4]}$le_separateur\
${le_champ[5]}$le_separateur\
${le_champ[6]}$le_separateur\
${le_champ[7]}$le_separateur\
${le_champ[8]}$le_separateur\
${le_champ[9]}$le_separateur\
${le_champ[10]}$le_separateur\
${le_champ[11]}" > ${csv_file}
}

#--------------------------
# Création du fichier VCARD
#--------------------------
CreerVcard(){
n==1
while read line ; do
   if [ n == 1 ] ; then 
         # pour sauter la ligne d'entête
         n+=n+1 
   else
      awk -F\; '{print \
"BEGIN:VCARD\n" \
"VERSION:4.0\n" \
"FN:"$1" "$2"\n" \
"TEL;TYPE=home,voice;VALUE=uri:tel:" $4 "\n" \
"TEL;TYPE=cell,voice;VALUE=uri:tel:" $5 "\n" \
"TEL;TYPE=work,voice;VALUE=uri:tel:" $6 "\n" \
"ADR;TYPE=HOME;LABEL="$7 " " $8 " " $9 "\n" \
"TITLE:"$10"\n" \
"BDAY:"$11"\n" \
"MAIL:"$12"\n" \
"NOTE:"$3"\n" \
"END:VCARD"}'
   fi
done < ${csv_file} > ${vcard_file} 
}

#--------------------
# Programme principal
#--------------------
case "$1" in
   -c)
      if [ $2 != "" ]; then AfficherAide ;
      else CreerEnteteCSV ; fi ;;
   -v)
      if [ $2 != "" ]; then
         if [ $3 != "" ]; then
            CreerVcard
         else
            AfficherAide   
         fi
      else
         AfficherAide
      fi
   ;;
   -h) AfficherAide ;;
   *) AfficherAide ;;
esac 

je ne fais pas beaucoup de bash en ce moment mais
on doit pouvoir alléger le print comme ça

for ligne in ${le_champ[@]}
do
    out+="$ligne$le_separateur"
done
echo $out

ça ajoute un séparateur de trop...
mais ça montre la préconisation de watael quant aux accolades de trop...

Hors ligne

#7 Le 30/09/2020, à 18:36

bruno

Re : Conversion de fichiers CSV vers VCARD [résolu]

Cela doit pouvoir ce faire en deux lignes avec csvtool

csvtool -t $separateur format 'BEGIN:VCARD\n VERSION:4.0\n FN:%1 %2\n TEL;TYPE=home,voice;VALUE=uri:tel: %4 \n TEL;TYPE=cell,voice;VALUE=uri:tel: %5 \n TEL;TYPE=work,voice;VALUE=uri:tel: %6 \n ADR;TYPE=HOME;LABEL=%7   %8   %9 \n TITLE:%10\n BDAY:%11\n MAIL:%12\n NOTE:%3\n END:VCARD' fichier.csv

Hors ligne

#8 Le 30/09/2020, à 19:05

Watael

Re : Conversion de fichiers CSV vers VCARD [résolu]

for ligne in "${le_champ[@]}"

/!\ il ne faut pas oublier les guillemets autour de la variable tableau, sinon ça risque de découper le tableau en ne respectant que l'IFS.


Connected \o/
Welcome to sHell. · eval is evil.

Hors ligne

#9 Le 05/03/2021, à 16:54

Philip-Francois

Re : Conversion de fichiers CSV vers VCARD [résolu]

Bonjour à tous,

HELP!

Le fichier Monfichier.csv ne se crée pas avec la syntaxe Convertir_CSV_VCARD -c Monfichier.csv.
Et ce, quelque soit le script utilisé, celui de arieugon ou avec les modifs des autres.
En retour du lancement du script, j'ai juste l'affichage de l'aide

Je tiens à vous dire que je suis encore débutant en scripts sous ubuntu mais perso je suis très intéressé par ce script là en particulier car je n'ai trouvé aucun "gratuiciel" me permettant de reporter des Note dans une Vcard!

Hors ligne

#10 Le 05/03/2021, à 18:10

Watael

Re : Conversion de fichiers CSV vers VCARD [résolu]

-c)
      if test $2 = ""; then AfficherAide; else CreerEnteteCSV; fi

que l'on pourrait écrire

-c) test -n "$2" && CreerEnteteCSV || AfficherAide

Connected \o/
Welcome to sHell. · eval is evil.

Hors ligne