J'ai déjà transformé un fichier de contacts (affichés dans une page HTML sous forme de tableaul, donc assez proche du csv) en format VCARD.

Assez simple à réaliser, j'ai fais ça en JavaScript.

Voici le code :
vcfs= "";
eol="\n";
numlig= 0;
while (numlig<nbrlig) {
fields= tablig[numlig].split('§');
w_nom= fields[0];
w_prenom= fields[1];
w_datenaissance= fields[2];
w_email= fields[3];
w_telfixe= fields[4];
w_mobile= fields[5];
w_adresse= fields[6];
w_codepostal= fields[7];
w_ville= fields[8];
w_codeffe= fields[9];
vcf= "";
vcf= vcf + "BEGIN:VCARD" + eol;
vcf= vcf + "VERSION:3.0" + eol;
vcf= vcf + "FN:" + w_nom + ", " + w_prenom + eol;
vcf= vcf + "N:" + w_nom + ";" + w_prenom + eol;
tab_mails= w_email.split(',');
nbrmail= tab_mails.length;
nummail= 0;
while (nummail < nbrmail) {
w_email= tab_mails[nummail];
if (w_email.length) vcf= vcf + "EMAIL;TYPE=HOME;TYPE=INTERNET:" + w_email + eol;
nummail++;
}
if (w_telfixe.length) vcf= vcf + "TEL;TYPE=HOME;VOICE:" + w_telfixe.replace(/^0/, "+33 ") + eol;
if (w_mobile.length) vcf= vcf + "TEL;TYPE=CELL;VOICE:" + w_mobile.replace(/^0/, "+33 ") + eol;
vcf= vcf + "ADR;TYPE=HOME;ENCODING=QUOTED-PRINTABLE:;" + w_adresse + "=0D=0A" + w_codepostal +" "+ w_ville + eol;
vcf= vcf + "BDAY:" + w_datenaissance + eol;
if (w_codeffe.length) vcf= vcf + "NOTE:" + "FFE: " + w_codeffe + eol;
vcf= vcf + "END:VCARD" + eol;
vcfs= vcfs + vcf;
numlig++;
}
form.elements[textarea].value= vcfs;
Le principe : chaque ligne contient les champs séparés par le caractère "§" (à remplacer par le ";" de csv).
Le résultat est placé dans une variable "vcfs" qui est ré-affichée à l'écran.

Bon, c'est un exemple de la méthode à utiliser.