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

PHP & Base de données Discussion :

[CSV-PHP] problème de virgule


Sujet :

PHP & Base de données

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Candidat au Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Décembre 2011
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2011
    Messages : 4
    Points : 3
    Points
    3
    Par défaut [CSV-PHP] problème de virgule
    Bonjour,

    Dans le cadre de mon projet de stage, je dois lire un fichier CSV puis le traiter. Plus précisément le traitement consiste à :

    1 - lire le fichier,
    2 - utiliser des expressions régulières pour reconnaitre les lignes,
    3 - inséré le tous en base de données.

    Rien de bien difficile au final, mais c'est à la troisième étape que sa coince !

    En faite j'ai une ligne du type suivant : 871;257322;171957;0,6666;;;;

    L'expression la reconnait sans problème mais le souci, c'est quand le tout est inséré dans la base, le chiffre a virgule ne passe pas ! Je précise qu'aucune erreur est généré et que le résultat enregistré est 0.0000

    Dans ma base, le champ pour cette donnée est de type float(10,9)

    J'ai déjà essayé beaucoup de chose pour remédier a se problème et je n'arrive toujours pas à remplacer la , par un . avant la requête d'insertion.

    Voici mon bout de code avec la dernière chose que j'ai testé pour changer la virgule, il se peut qu'il y est des erreurs :

    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
    $link = mysql_connect("localhost", "root", "");
    if (!$link) 
    {
        die('Connexion impossible : ' . mysql_error());
    }
    else
    {
        mysql_select_db('pharmagen');
        $fic = fopen($content_dir.$name_file, 'a+'); 
        while(!feof($fic))
    	{	
    	     $ligne= fgets($fic,1024);
    	     if (preg_match('#(\d{3});(\d{3,6});(\d{3,6});(0[,\.]\d{2,9});;;;#',$ligne))
    		{	
    		    list ($numO, $nbbd, $nbbdg, $tdgc) = explode(';', $ligne);	
                        $taudgc=number_format($tdgc, 9, '.', '');
    	            $sql = "INSERT INTO objectiforganisme VALUES ('4433', '$nbbd', '$nbbdg', '$taudgc','', '$numO');";
    		    $req = mysql_query($sql) or die('Erreur SQL !<br>'.$sql.'<br>'.mysql_error());
    		}
           }
    }
    fclose($fic);
    unlink($content_dir.$name_file);
    mysql_close($link);
    J'espère que je vous ai pas trop embrouillé avec toute mes explication et que le problème posé est clair !

    Si un sujet existe déjà, je m'en excuse mais je n'ai pas réussi à le trouver

  2. #2
    Expert éminent
    Avatar de Benjamin Delespierre
    Profil pro
    Développeur Web
    Inscrit en
    Février 2010
    Messages
    3 929
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Février 2010
    Messages : 3 929
    Points : 7 762
    Points
    7 762
    Par défaut
    Pour lire et écrire dans un CSV, utilise fgetcsv et fputcsv et non pas des expressions régulières

  3. #3
    Candidat au Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Décembre 2011
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2011
    Messages : 4
    Points : 3
    Points
    3
    Par défaut
    Merci de ta réponse,

    je vais essayé avec les fgetcsv et fputcsv mais j'ai quand même besoin de mes expressions régulières car j'ai 4 lignes "types" dans le fichier CSV que j'exploite. J'ai donc besoin de les reconnaitre pour faire le bon traitement, c'est à dire les envoyer au bonne endroit dans la base de données.

    quand j'aurais fais mes test je ferais un édit

    -----------------------------
    EDIT
    -----------------------------

    Pour lire les lignes, le fgtcsv me sort énormément d'erreur

  4. #4
    Membre régulier Avatar de eaglesnipe
    Homme Profil pro
    Ingénieur Etudes et Développement
    Inscrit en
    Janvier 2008
    Messages
    75
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur Etudes et Développement
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Janvier 2008
    Messages : 75
    Points : 76
    Points
    76
    Par défaut
    Bonjour,

    En ce qui concerne la gestion du fichier CSV, je suis en accord avec Benjamin Delespierre : utiliser fgetcsv.

    D'après ton expression régulière, tu traites les 4 premiers éléments de ta ligne CSV. fgetcsv te renverra un tableau représentant chacun des éléments de ta ligne. Rien ne t'empêche alors de ne traiter que les 4 premières valeurs.

    En ce qui concerne ton problème d'insert BDD, tu utilises number_format pour transformer ta virgule en point. Attention, cette fonction attend en paramètre un float. Le séparateur décimal d'un float est le point et non la virgule, elle ne fera donc pas le travail demandé au vu de la valeur que tu lui passes (0,6666) [d'ailleurs tu devrais avoir un joli Notice qui traine quelque part...]

    Dans ton cas, un simple str_replace devrait faire l'affaire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $taudgc=str_replace(',', '.', $tdgc);

  5. #5
    Candidat au Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Décembre 2011
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2011
    Messages : 4
    Points : 3
    Points
    3
    Par défaut
    J'avais déjà essayé cette ligne, mais il se peut que je l'avais mal utilisé

    Il y a un problème qui se pose maintenant, c'est quand utilisant le fgetcsv j'ai une erreur (plein en fait ) m'indiquant que les paramètres du preg_match sont incorrect. Je vois clairement le problème mais je ne sais pas trop comment le résoudre.

    En gros, l'expression qui est une chaîne est comparé à tableau et sa me plante tous

    Je cherche comment corrigé sa, j'ai ma petite idée

  6. #6
    Membre régulier Avatar de eaglesnipe
    Homme Profil pro
    Ingénieur Etudes et Développement
    Inscrit en
    Janvier 2008
    Messages
    75
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur Etudes et Développement
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Janvier 2008
    Messages : 75
    Points : 76
    Points
    76
    Par défaut
    La question est : pourquoi tu continues à utiliser des expressions régulières ?

    Un exemple simple pris sur php.net :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    <?php
    $row = 1;
    if (($handle = fopen("test.csv", "r")) !== FALSE) {
        while (($data = fgetcsv($handle, 1000, ";")) !== FALSE) {
            $num = count($data);
            echo "<p> $num fields in line $row: <br /></p>\n";
            $row++;
            for ($c=0; $c < $num; $c++) {
                echo $data[$c] . "<br />\n";
            }
        }
        fclose($handle);
    }
    ?>
    Exemple de fichier test.csv :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    1;2;3;4;5;6;7;8;9
    10;11;12;13;14;15;16;17;19
    Résultat obtenu :
    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
     
    9 fields in line 1: 
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    9 fields in line 2: 
    10
    11
    12
    13
    14
    15
    16
    17
    19
    Le tableau $data retourné par fgetcsv contient les données de la ligne en cours de traitement, donc chacun des éléments de ta ligne. Ne te reste plus qu'à traiter ces différents éléments de la manière dont tu le souhaites, sans utiliser d'expression régulière (puisque tu as déjà chacun des éléments de ta ligne dans le tableau...)

    Ou ai-je raté quelque chose ??

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Problème de virgule
    Par Drax dans le forum Débuter
    Réponses: 12
    Dernier message: 04/12/2005, 14h40
  2. [D7] Problème de virgule flottante
    Par Magnus dans le forum Langage
    Réponses: 17
    Dernier message: 22/09/2005, 14h56
  3. [ postgresql - php ] problèmes de connexion a une base
    Par diableblanc dans le forum PostgreSQL
    Réponses: 2
    Dernier message: 12/07/2005, 19h27
  4. [PHP]problème avec strftime()...
    Par sanosuke85 dans le forum Langage
    Réponses: 5
    Dernier message: 26/05/2005, 10h02
  5. [Kylix] Problème de virgule/DBExpress
    Par jeanphy dans le forum EDI
    Réponses: 5
    Dernier message: 12/02/2003, 16h29

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