IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage PHP Discussion :

Traitement d'une chaîne contenant " et ,


Sujet :

Langage PHP

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    83
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juin 2006
    Messages : 83
    Points : 58
    Points
    58
    Par défaut Traitement d'une chaîne contenant " et ,
    Je dispose d'un fichier .CSV destiné à alimenter une table mySQL. Le contenu de ce fichier ressemble à :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    champ1,champ2,...,"chaîne contenant,suite chaîne",champ n
    Comme vous l'avez remarqué, la virgule sert de séparateur de champ. Je n'ai pas de problème particulier à par la chaîne qui est entourée de guillemets et qui contient des virgules.
    J'arrive à supprimer les guillemets en utilisant la fonction preg_replace(..) mais je ne sais pas comment traiter les virgules à l'intérieur de cette chaîne
    J'ai essayé avec la fonction ereg() mais elle est dépréciée et déconseillée dans tous les manuels.
    Je dois enlever les virgules car j'utilise fgetcsv() pour traiter chaque ligne du fichier afin de l'envoyer dans ma table...
    Une aide serait la bienvenue svp

  2. #2
    Membre éprouvé Avatar de sebhm
    Homme Profil pro
    Développeur Web
    Inscrit en
    Avril 2004
    Messages
    1 090
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Landes (Aquitaine)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Avril 2004
    Messages : 1 090
    Points : 1 241
    Points
    1 241
    Par défaut
    bonjour,

    je ne comprends pas bien.
    la chaine entre les guillemets n'est en fait qu'un seul champ ?
    si oui, la fonction fgetcsv te permet de définir le séparateur (la virgule) ET "l'englobeur" (les guillemets).
    Tu n'as alors rien à faire...

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    83
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juin 2006
    Messages : 83
    Points : 58
    Points
    58
    Par défaut
    Merci pour ta réponse,

    Citation Envoyé par sebhm Voir le message
    la chaine entre les guillemets n'est en fait qu'un seul champ ?
    Oui, la forme est du type
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    champ1,champ2,"chaine contenant des virugles et englobée par des guillemets",champ3,...champ n
    si oui, la fonction fgetcsv te permet de définir le séparateur (la virgule) ET "l'englobeur" (les guillemets).
    Tu n'as alors rien à faire...
    J'utilise effectivement la fonction fgetcsv() sans probleme avec les champs standards, mais le soucis arrive avec la chaine spéciale car si elle contient des virgules, c'est considéré par la fonction comme des séparateurs...

    J'ai dans mon algo un premier fgetcsv avec comme séparateur la virgule, je sais pas comment implémenter un deuxieme fgetcsv dans la meme boucle sans interferer le traitement du premier

  4. #4
    Membre éprouvé Avatar de sebhm
    Homme Profil pro
    Développeur Web
    Inscrit en
    Avril 2004
    Messages
    1 090
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Landes (Aquitaine)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Avril 2004
    Messages : 1 090
    Points : 1 241
    Points
    1 241
    Par défaut
    est-ce que tu utilises bien le 4eme parametre de la fonction fgetcsv() ??

    montre nous l'appel de ta fonction

  5. #5
    Membre du Club
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    83
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juin 2006
    Messages : 83
    Points : 58
    Points
    58
    Par défaut
    Citation Envoyé par sebhm Voir le message
    est-ce que tu utilises bien le 4eme parametre de la fonction fgetcsv() ??

    montre nous l'appel de ta fonction
    Je n'utilise pas le 4ème paramètre, ci-dessous la fonction

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    if (($fp = fopen("test.csv", "r")) !== FALSE) {
        while (($data = fgetcsv($fp, 1024, ",")) !== FALSE) {
     
    	    //lecture par ligne
    	    //echo "$data<br>";
     
            }
        }
        fclose($fp);
    }

  6. #6
    Membre éprouvé Avatar de sebhm
    Homme Profil pro
    Développeur Web
    Inscrit en
    Avril 2004
    Messages
    1 090
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Landes (Aquitaine)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Avril 2004
    Messages : 1 090
    Points : 1 241
    Points
    1 241
    Par défaut
    ben justement, utilise le !

  7. #7
    Membre du Club
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    83
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juin 2006
    Messages : 83
    Points : 58
    Points
    58
    Par défaut
    Je ne comprends pas, j'ai fait un test sans utiliser le 4e paramètre, j'ai des chaines du type
    champ 1, champ 2, "bizarre, ça marche, avec, des virugles", ..., champ n
    et ce coup ci ça a l'air de fonctionner
    voila le code:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
     
    $row =1;
    $fp_in=fopen($file,"r");
    if ($fp_in == FALSE) {
    echo "erreur ouverture fichier <br>";
    exit;
    }
    else {
    //echo "ouverture fichier<br>";
    echo "<table border=1>";
    while($data= fgetcsv($fp_in,1024,',')) {
    	echo "<tr>";
    	$col = count($data);
    	//echo " <p>champ $col, ligne $row</p><br>";
    	$row++;
    	for($i = 0; $i < $col ; $i++){
    	if($data[$i]==NULL) $data[$i]='N/A';
    	echo "<td>$data[$i]</td>";
    	}
    echo "</tr>";
    }
    echo "</table>";
    }
     
    fclose ($fp_in);
    Merci d'avoir pris le temps de m'aider

  8. #8
    Membre éprouvé Avatar de sebhm
    Homme Profil pro
    Développeur Web
    Inscrit en
    Avril 2004
    Messages
    1 090
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Landes (Aquitaine)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Avril 2004
    Messages : 1 090
    Points : 1 241
    Points
    1 241
    Par défaut
    bien oui, j'aurais du voir que le caractere "guillemet double" est l'englobeur par défaut

  9. #9
    Membre du Club
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    83
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juin 2006
    Messages : 83
    Points : 58
    Points
    58
    Par défaut
    Une chose de réglée, j'en profite pour une question supplémentaire : j'ai oublié de préciser que certains champs comportent aussi des simples guillemets = apostrophe du genre:
    champ 1, champ 2,blue's,...,champ n
    Faut-il un traitement spécifique, genre rajouter un antislah avant de l'insérer dans ma table ?
    En l'état, j'ai des erreurs sql si je tente d'insérer un tel champ dans ma table.
    (la table est en varchar(255) encodée en utf8_general_ci)

  10. #10
    Membre éprouvé Avatar de sebhm
    Homme Profil pro
    Développeur Web
    Inscrit en
    Avril 2004
    Messages
    1 090
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Landes (Aquitaine)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Avril 2004
    Messages : 1 090
    Points : 1 241
    Points
    1 241
    Par défaut
    il faut 'échapper' les caracteres spéciaux avant de les insérer en BD.
    par exemple avec mysql, il te suffit d'utiliser la fonction mysql_real_escape_string

Discussions similaires

  1. Réponses: 4
    Dernier message: 14/01/2008, 14h09
  2. [debutant]TRaitement d'une chaîne
    Par petiteso dans le forum Servlets/JSP
    Réponses: 1
    Dernier message: 13/07/2007, 16h41
  3. [RegEx] Traitement d'une chaîne de caractères
    Par Youn05 dans le forum Langage
    Réponses: 4
    Dernier message: 01/04/2007, 12h18
  4. [MySQL] Traitement d'une chaîne avant insertion
    Par yann_p dans le forum PHP & Base de données
    Réponses: 13
    Dernier message: 18/08/2006, 15h20

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo