Précédent   Forum des professionnels en informatique > PHP > PHP & SGBD
PHP & SGBD Forum d'entraide sur les SGBD avec PHP. Avant de poster : FAQ BDD, toutes les FAQ PHP, cours BDD et sources BDD
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 23/12/2011, 10h01   #1
Invité de passage
 
Femme
Étudiant
Inscription : 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 : 1
Points : 1
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 :
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
lilo36 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/12/2011, 10h40   #2
Modérateur
 
Avatar de Benjamin Delespierre
 
Benjamin Delespierre
Développeur Web
Inscription : février 2010
Messages : 2 991
Détails du profil
Informations personnelles :
Nom : Benjamin Delespierre
Âge : 24
Localisation : France

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

Informations forums :
Inscription : février 2010
Messages : 2 991
Points : 5 031
Points : 5 031
Pour lire et écrire dans un CSV, utilise fgetcsv et fputcsv et non pas des expressions régulières
__________________
A la recherche d'un framework MVC facile a prendre en main ? Essayez Axiom
Nouveau: la référence d'Axiom est disponible sur GitHub (je la peaufine en ce moment même).

Un problème correctement identifié est à moitié résolu, évitez de poster l'intégralité de votre code avec pour seule explication "ça ne marche pas...".
Pour identifier correctement vos problèmes PHP, utilisez la gestion des erreurs et xdebug.

Les boutons et existent, servez-vous en
Benjamin Delespierre est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/12/2011, 10h49   #3
Invité de passage
 
Femme
Étudiant
Inscription : 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 : 1
Points : 1
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
lilo36 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/12/2011, 11h07   #4
Nouveau Membre du Club
 
Avatar de eaglesnipe
 
Homme Yoann Rousseau
Ingénieur Etudes et Développement
Inscription : janvier 2008
Messages : 46
Détails du profil
Informations personnelles :
Nom : Homme Yoann Rousseau
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 : 46
Points : 35
Points : 35
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 :
$taudgc=str_replace(',', '.', $tdgc);
eaglesnipe est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 23/12/2011, 11h22   #5
Invité de passage
 
Femme
Étudiant
Inscription : 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 : 1
Points : 1
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
lilo36 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/12/2011, 11h48   #6
Nouveau Membre du Club
 
Avatar de eaglesnipe
 
Homme Yoann Rousseau
Ingénieur Etudes et Développement
Inscription : janvier 2008
Messages : 46
Détails du profil
Informations personnelles :
Nom : Homme Yoann Rousseau
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 : 46
Points : 35
Points : 35
La question est : pourquoi tu continues à utiliser des expressions régulières ?

Un exemple simple pris sur php.net :

Code :
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 :
1
2
1;2;3;4;5;6;7;8;9
10;11;12;13;14;15;16;17;19
Résultat obtenu :
Code :
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 ??
eaglesnipe est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/12/2011, 11h57   #7
Invité de passage
 
Femme
Étudiant
Inscription : 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 : 1
Points : 1
Je vais voir si je peux exploiter ces codes.

En fait, si je m'entête à utiliser les expressions régulières c'est parce que j'ai un fichier de se type :

Citation:
871;257322;171957;0,6666;;;;
2011-08;871;1798;1108;0,612;valaciclovir;0;;
2011-08;871;1498;613;0,576193993;macrogol 4000;0;;
2011-08;871;898;331;0,968546;losartan + hctz;0;;
2011-08;871;949;347;0,65432;BORAX + BORIQUE (acide);0;;
2011-08;87200024;pharmacie 1;871;3;0;0;losartan;0
2011-08;87200024;pharmacie 1;871;17;10;0,545;BORAX + BORIQUE (acide);0
;871;87200024;1;749;379;0,5065;;
2011-08;87200025;pharmacie 2;871;9;1;0,12;valaciclovir;0
2011-08;87200025;pharmacie 2;871;17;0;0;macrogol 4000;0
;871;87200025;1;849;429;0,6145;;
La ce n'est qu'un exemple, un fichier complet comporte plus 500 lignes.

Et la deuxième raison est que mon maître de stage me l'impose

--------------------
Edit
--------------------

J'ai finis par trouver la solution , grand merci à eaglesnipe pour le bout de code suivant :

Code :
$taudgc=str_replace(',', '.', $tdgc);
Car comme je m'en doutais, je l'avais mal utilisé la première fois.

Après, concernant le fgetcsv, il est peut être très utile, mais je n'ai pas réussi à adapter tout mon code pour qu'il fonctionne.

En tout cas, merci au personne qui on bien voulu m'aider !
lilo36 est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 21h00.


 
 
 
 
Partenaires

Hébergement Web