Salut,
Bonjour,
je sèche sur un truc et si jamais quelqu'un à une idée pour me réhydrater, je suis preneur.
Sur une petite appli, j'ai un form d'upload de fichiers CSV venant de logiciel de messagerie. Je traite ce fichier via PHP pour extraire uniquement les adresses mail. Jusque là tout va bien.
Mon soucis : suivant la source (le logiciel de messagerie utilisé), le délimitateur est soit une virgule, soit un point virgule .... et là grosse probleme !!!
Comment je fais pour déterminer quel type de délimitateur a été utilisé en sachant que pour mon traitement de fichier, je passe par fgetcsv.
en gros, là je fais mon fgetcsv avec la virgule mais je voudrais pouvoir lui dire :
si délimitateur == "," passe par fgetcsv virgule, sinon, passe par fgetcsv point virgule.
Une méthode de bourrin consisterait à compter le nb de virgule et le nb de point virgule dans le fichier et de considérer que le caractère qui remporte la palme est le délimitateur.
mais je cherche si il y a une solution moins bulldozer, un truc popre.
merci
Je sèchais depuis hier puis ce matin une idée m'est venue... Pas géniale côte beauté du script
mais un peu moins "bourinne" que celle dont tu parles.
L'idée est assez bête et ne peut marcher que si au moins une adresse mail est au début ou au milieu de la
chaine à scanner. Un petit exemple:
<?php
// Le chargement du fichier
//
$fp = fopen("Ton_Fichier", "r");
$line = fgets($fp, 1024);
fclose($fp);
// La pattern de recherche \C
//
$pattern = "#\w*[@][\w|-]*\.\w*?(\C)(\C)#Uims";
// Alternative .
//
$pattern = "#\w*[@][\w|-]*\.\w*?(.)(.)#Uims";
// L'inévitable fonction de recherche
//
preg_match($pattern, $line, $match);
// Le délimiteur de champs
//
$delim = $match[1];
// Le séparateur de champs
//
$separator = $match[2];
?>
J'ai essayé avec ce type de ligne et ca marche :
>
$line = "\"1\",\"[email protected]\",\"bonjour\",\"[email protected]\"";
Ca me retourne le premier mail avec les 2 caractères qui suivent. Le pattern peut être retouché si
tu observes des "chars" incongrus pour certaines adresses...
Voila, je pense que c'est viable... Mais comme je l'ai souligné c'est pas "tip-top" niveau beauté lol
...l'idée est en marche à toi de l'adapter @+ bon code

Salut,
[quote="Gustavo"]
Bonjour,
je sèche sur un truc et si jamais quelqu'un à une idée pour me réhydrater, je suis preneur.
Sur une petite appli, j'ai un form d'upload de fichiers CSV venant de logiciel de messagerie. Je traite ce fichier via PHP pour extraire uniquement les adresses mail. Jusque là tout va bien.
Mon soucis : suivant la source (le logiciel de messagerie utilisé), le délimitateur est soit une virgule, soit un point virgule .... et là grosse probleme !!!
Comment je fais pour déterminer quel type de délimitateur a été utilisé en sachant que pour mon traitement de fichier, je passe par fgetcsv.
en gros, là je fais mon fgetcsv avec la virgule mais je voudrais pouvoir lui dire :
si délimitateur == "," passe par fgetcsv virgule, sinon, passe par fgetcsv point virgule.
Une méthode de bourrin consisterait à compter le nb de virgule et le nb de point virgule dans le fichier et de considérer que le caractère qui remporte la palme est le délimitateur.
mais je cherche si il y a une solution moins bulldozer, un truc popre.
merci
[/quote]
Je sèchais depuis hier puis ce matin une idée m'est venue... Pas géniale côte beauté du script
mais un peu moins "bourinne" que celle dont tu parles.
L'idée est assez bête et ne peut marcher que si au moins une adresse mail est au début ou au milieu de la
chaine à scanner. Un petit exemple:
[php]
<?php
// Le chargement du fichier
//
$fp = fopen("Ton_Fichier", "r");
$line = fgets($fp, 1024);
fclose($fp);
// La pattern de recherche \C
//
$pattern = "#\w*[@][\w|-]*\.\w*?(\C)(\C)#Uims";
// Alternative .
//
$pattern = "#\w*[@][\w|-]*\.\w*?(.)(.)#Uims";
// L'inévitable fonction de recherche
//
preg_match($pattern, $line, $match);
// Le délimiteur de champs
//
$delim = $match[1];
// Le séparateur de champs
//
$separator = $match[2];
?>
[/php]
J'ai essayé avec ce type de ligne et ca marche :
> [i]$line = "\"1\",\"
[email protected]\",\"bonjour\",\"
[email protected]\"";[/i]
Ca me retourne le premier mail avec les 2 caractères qui suivent. Le pattern peut être retouché si
tu observes des "chars" incongrus pour certaines adresses...
Voila, je pense que c'est viable... Mais comme je l'ai souligné c'est pas "tip-top" niveau beauté lol
...l'idée est en marche à toi de l'adapter @+ bon code ;)