detecter séparateur dans fichier CSV

Répondre


Cette question est un moyen d’empêcher des soumissions automatisées de formulaires par des robots.
Smileys
:D :) :( :o :shock: :? 8-) :lol: :x :P :oops: :cry: :evil: :twisted: :roll: :wink: :!: :?: :idea: :arrow: :| :mrgreen: =D> #-o =P~ :^o :non: :priere: 8-|
Voir plus de smileys
  Revue du sujet
 

  Étendre la vue Revue du sujet : detecter séparateur dans fichier CSV

Re: detecter séparateur dans fichier CSV

par FuZZyLine » 04 nov. 2009, 10:29

Salut,
Hello,
J'ai à peu près saisie ton code fuzzyline. Cependant, ta pattern est légèrement fausse :
(ex : [email protected])
$pattern = "#^[-_.a-z0-9]+@[-_.a-z0-9]{2,}\.[a-z]{2,4}$#";
En revanche, ton idée est pas mal. Afin d'aider Gustavo et de continuer dans ton idée, je rajouterai ceci :
* sachant que dans un csv standard, le texte est entouré par des guillemets (") et que tu cherches une donnée précises (que tu as trouvés (courriel)) :
** chercher la donnée (email)
** chercher le guillemet avant et après email (là, j'ai pas d'idée de code qui me vient à l'esprit)
** et enfin récupérer le caractère juste avant et après le guillemet.
bonne soirée à toi
nb : c'est amusant, j'ai fait dernièrement un objet csv et je pensais ces jours ci à encore l'améliorer. Notamment la recherche du délimiteur et la sélection des données par attribut.
Non, non... parfaitement "vrai" lol Mais comme je l'ai dis le pattern peut être amélioré ;)

@+ bon code ;)

Re: detecter séparateur dans fichier CSV

par niuxe » 04 nov. 2009, 00:32

Hello,

J'ai à peu près saisie ton code fuzzyline. Cependant, ta pattern est légèrement fausse :
(ex : [email protected])

$pattern = "#^[-_.a-z0-9]+@[-_.a-z0-9]{2,}\.[a-z]{2,4}$#";

En revanche, ton idée est pas mal. Afin d'aider Gustavo et de continuer dans ton idée, je rajouterai ceci :
* sachant que dans un csv standard, le texte est entouré par des guillemets (") et que tu cherches une donnée précises (que tu as trouvés (courriel)) :
** chercher la donnée (email)
** chercher le guillemet avant et après email (là, j'ai pas d'idée de code qui me vient à l'esprit)
** et enfin récupérer le caractère juste avant et après le guillemet.

bonne soirée à toi

nb : c'est amusant, j'ai fait dernièrement un objet csv et je pensais ces jours ci à encore l'améliorer. Notamment la recherche du délimiteur et la sélection des données par attribut.

Re: detecter séparateur dans fichier CSV

par Gustavo » 23 oct. 2009, 18:19

Salut !

Yeh !!! merci ! :D Je vais creuser cette piste;
Je n'y pense jamais à ce genre de fonctions (les preg_xxx)

Bon WE !

Re: detecter séparateur dans fichier CSV

par FuZZyLine » 23 oct. 2009, 09:52

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 ;)

Re: detecter séparateur dans fichier CSV

par jojolapine » 22 oct. 2009, 16:19

Oups... j'avions pas vu... :-°

Re: detecter séparateur dans fichier CSV

par Gustavo » 22 oct. 2009, 16:15

Tu peux éventuellement compter le nombre d'occurences de l'un ou l'autre caractère... (si tu as liste prédéfinies bien sûr)
M'est avis, que l'occurence la plus élevée correspondra à ton séparateur...
Après il reste la limitation soulevée par fab, c'est que c'est configurable à souhait, donc tu peux très bien te retrouver avec des §!/*%|\~_ etc...
ah ba oui, c'est ça la méthode de bourrin dont je parlais :)
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.
les utilisateurs sont briffés sur la virgule mais entre la virgule et le point-virgule, je préfère gérer l'erreur possible (mais si, je fais confiance à l'utilisateur !!!)

Merci en tous cas de ta réponse !

Re: detecter séparateur dans fichier CSV

par jojolapine » 22 oct. 2009, 15:44

Si tu veux vraiment essayer de le deviner...
Tu peux éventuellement compter le nombre d'occurences de l'un ou l'autre caractère... (si tu as liste prédéfinies bien sûr)
M'est avis, que l'occurence la plus élevée correspondra à ton séparateur...
Après il reste la limitation soulevée par fab, c'est que c'est configurable à souhait, donc tu peux très bien te retrouver avec des §!/*%|\~_ etc...

Et sinon pourquoi ne pas demander à l'utilisateur le séparateur?
Disons que soit il le sait, et comme ça pas de questions à se poser... Soit il le sait pas, et ça veut dire qu'il a fait son export en mode "tout guidé" et qu'il y a de fortes chances que ce soit "," ou ";" ou encore l'espace...
En tout cas ça réduit les possibilités :)

Re: detecter séparateur dans fichier CSV

par Gustavo » 22 oct. 2009, 15:11

Arghhh ...
moi qui voulait donner dans l'élégance et la délicatesse ...

Merci en tous cas de cette réponse si rapide !

Re: detecter séparateur dans fichier CSV

par fab » 22 oct. 2009, 15:05

Malheureusement, il ne semble pas qu'il existe une méthode pour trouver le séparateur à coup sur... Le format CSV te permet à n'importe qui de le changer donc...

detecter séparateur dans fichier CSV

par Gustavo » 22 oct. 2009, 14:59

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