PHP|Débutant :: Forums

Advertisement

Besoin d'aide ? N'hésitez pas, mais respectez les règles

Vous n'êtes pas identifié(e).

#1 25-02-2010 09:50:05

meche
Membre
Inscription : 25-02-2010
Messages : 5

Php, lecture fichier csv pour insertion Mysql

Bonjours a tous,

J'aurai besoin de créer un script capable de lire un fichier CSV, comportant plusieurs colonnes, puis de les exploiter en les inserants dans une table (voir plusieurs, mais precedons par étapes lol)

Apres quelques recherche, je suis tombé sur la fonction fgetcsv()

J'ai donc repris l'exemple qui lit le fichier puis affiche les données :

[code php]<?php
$row = 1;
if (($handle = fopen("test.csv", "r")) !== FALSE) {
    while (($data = fgetcsv($handle, 1000, ";")) !== FALSE) {
        $num = count($data);
        echo "<p> $num champs à la ligne $row: <br /></p>\n";
        $row++;
        for ($c=0; $c < $num; $c++) {
            echo $data[$c] . "<br />\n";
        }
    }
    fclose($handle);
}
?>[/code]

J'arrive a comprendre a peu pret comment fonctionne ce script, sauf la parti exploitation des données:

for ($c=0; $c < $num; $c++) {
            echo $data[$c] . "<br />\n";

D'après ce qui est expliqué, cette fonction place les données dans un tableau, donc j'imagine que c'est en comprennant comment exploiterun tableau en php que je trouverais ma solution.

Si vous avez une idée, un lien comment exploiter un fichier csv, et si je suis dans le bon concernant les tableaux, je suis prenneur.

Merci

Hors ligne

#2 25-02-2010 10:37:05

Maljuna Kris
Infantimigulo
Lieu : Douarnenez 29100 Breizh Izel
Inscription : 08-05-2009
Messages : 2 453
Site Web

Re : Php, lecture fichier csv pour insertion Mysql

Saluton,
Le problème de ce script, c'est qu'il est loin d'être optimisé.
D'autre part, si tu es sûr du contenu du fichier CSV, je te conseillerais plutôt de t'orienter vers LOAD DATA avec  MySQL


Gloire à qui n'ayant pas d'idéal sacro-saint,
Se borne à ne pas trop emmerder ses voisins. G. Brassens Don Juan 1976.
Avĉjo MoKo kantas
La chaîne YouTube MoKo Papy

Hors ligne

#3 25-02-2010 12:02:14

meche
Membre
Inscription : 25-02-2010
Messages : 5

Re : Php, lecture fichier csv pour insertion Mysql

Qu'est ce qui rend ce script non optimisé ??

Je suis sur de mon CSV, seulement dans ce fichier il faudra faire des traitement avants de pouvoir les inserer dans ma base de donnée.

Je m'explique; Ce fichier contiendra un tableau de 9 colonnes, Dans une de ses collones, la chaine est "BAT_B > ET_2 > b210"

Avant de l'inserer dans ma table, je vais devoir separé cette chaine entre chaque ">" ce qui donnerai 3 chaine au lieu d'une et donc au final pour me retrouver avec un tableau de 11 colonnes et non de 9 comme au début.

Il y'a également autre chose, ce fichier CSV est une mise a jours, et sera utilisé peut etre une fois par mois comme tel, mais bon la quelque soit la méthode la difficulté sera la même.

Je ne sais pas si cette contrainte peut m'empecher d'utiliser la méthode LOAD DATA que tu m'indique (merci pour le lien wink )?!

Hors ligne

#4 25-02-2010 13:19:03

dionysos
Membre
Lieu : Montpellier
Inscription : 18-02-2010
Messages : 24

Re : Php, lecture fichier csv pour insertion Mysql

Qu'y-a-t'il que tu ne comprends pas ?
$data est un tableau, à une dimension, qui contient une ligne de ton fichier csv après l'appel à fgetcsv().
$num est le nombre de colonnes (champs) dans cette ligne.
$row est la ligne du fichier actuellement traitée.

for ($c=0; $c < $num; $c++) : pour tous les champs de cette ligne
echo $data[$c] . "<br />\n"; afficher le champ à l'écran

Il est peu probable que dans ton cas, tu aies besoin de cette boucle for.

Un exemple de traitement pourrait être :

<?php
if (($handle = fopen("test.csv", "r")) !== FALSE) {
   while (($data = fgetcsv($handle, 1000, ";")) !== FALSE) {
     $nom = $data[0];
     $prenom = $data[1];
     $age = $data[2];
     ...
     $cas_particulier = $data[6];
     $tel = $data[7];
     $courriel = $data[8];

     $cas_particulier = explode(">",$cas_particulier);
     $cas1 = $cas_particulier[0];
     $cas2 = $cas_particulier[1];
     $cas3 = $cas_particulier[2];
 
     $requete = "INSERT INTO ma_table (nom,prenom,age,...,cas1,cas2,cas3,tel,courriel)
                  VALUES ('$nom','$prenom','$age',...,'$cas1','$cas2','$cas3','$tel','$courriel')"
;
     mysql_query($requete);
    }
  fclose($handle);
 }
?>

Ce n'est certainement pas optimisé wink mais je pense que cela a le mérite d'être clair et pédagogique.

Dernière modification par dionysos (25-02-2010 13:21:17)

Hors ligne

#5 25-02-2010 13:53:45

Maljuna Kris
Infantimigulo
Lieu : Douarnenez 29100 Breizh Izel
Inscription : 08-05-2009
Messages : 2 453
Site Web

Re : Php, lecture fichier csv pour insertion Mysql

C'est peut-être aller un peu vite en besogne, si le fichier est une mise à jour, il n'est plus question d'INSERT mais d'UPDATE.
Et là, on se heurte, entre autres, à la problématique de l'identifiant.


Gloire à qui n'ayant pas d'idéal sacro-saint,
Se borne à ne pas trop emmerder ses voisins. G. Brassens Don Juan 1976.
Avĉjo MoKo kantas
La chaîne YouTube MoKo Papy

Hors ligne

#6 25-02-2010 14:57:34

meche
Membre
Inscription : 25-02-2010
Messages : 5

Re : Php, lecture fichier csv pour insertion Mysql

Maljuna Kris, j'ai regardé et essayer avec la méthode LOAD DATA INFILE de cette maniere :

LOAD DATA INFILE 'glpi.csv'
        INTO TABLE test
FIELDS
        TERMINATED BY ';'
        ENCLOSED BY '"'
        ESCAPED BY '\\'
LINES
        STARTING BY ''
        TERMINATED BY '\n'
(nom, lieu, modele, mac, numero, type, fabricant, os)

Seulement, il m'arrete l'insertion a la ligne 112 sur un total de 224, mais cela est du a mon fichier CSV (tester avec un fichier bateau de 300 ligne et cela fonctionne sans souci). Ca fonctionne tres bien !! Sauf que j'ai du placer le fichier dans un repertoire du serveur mysql.. (je suis pas tres doué c'est vrai yikes )

Dionisos:

C'est bien le coup du tableau et de comment utiliser les données que je n'avais pas compris !!

Donc $data est le tableau, alimenté par la fonction: fgetcsv.  Du coup il reste plus qu'a recuperé les informations via $data[x] ou X correspond au numero de la colone de mon tableau.

Au passage merci pour la fonction explode(), elle est vraiment génial ^^


Merci encore pour tes explications clair, et ton exemple carrement fonctionnel ! je l'ai adapter a mes besoins et fonctionne parfaitement:
[code php]
<?php
$dbhost = 'localhost';
$dbuser = 'root';
$dbpass = '';

$conn = mysql_connect($dbhost, $dbuser, $dbpass) or die                      ('Error connecting to mysql');

$dbname = 'loaddata';
mysql_select_db($dbname);




if (($handle = fopen("glpi.csv", "r")) !== FALSE) {
   while (($data = fgetcsv($handle, 1000, ";")) !== FALSE) {
   
    $nom        = $data[0];
    $lieu        = $data[1];
    $modele        = $data[2];
    $mac        = $data[3];
    $numero     = $data[4];
    $type        = $data[5];
    $fabricant    = $data[6];
    $os            = $data[7];

     $cas_particulier = explode(">",$lieu);
     $batiment     = $cas_particulier[0];
     $etage     = $cas_particulier[1];
     $salle        = $cas_particulier[2];

     $requete = "INSERT INTO test (nom, batiment, etage, salle, modele, mac, numero, type, fabricant, os)
                 VALUES ('$nom', '$batiment', '$etage', '$salle', '$modele', '$mac', '$numero', '$type', '$fabricant', '$os')";
     mysql_query($requete);
    }
  fclose($handle);
}
?>
[/code]

Maljuna Kris: Effectivement, il ne faut pas que j'oublie ca !! Je penser faire une verification avant l'insertion mysql pour verifier si un ou plusieurs champs sont déja present dans ma table. Il est biensur hors de question d'avoir des doublons ou bien de modifier l'id de l'enregistrement, ca serai assez problèmatique lol

Dernière modification par meche (25-02-2010 14:58:46)

Hors ligne

#7 08-03-2010 18:55:12

meche
Membre
Inscription : 25-02-2010
Messages : 5

Re : Php, lecture fichier csv pour insertion Mysql

Je continu mon petit script, J'ai donc ajouter quelques élèments afin de tester si les donnees existe deja dans ma base afin d'éviter les doublons.

La ou c'est assez difficile c'est qu'il faut que j'alimente plusieurs table, et que certaines table ont des liaisons. L'id d'un nouvel enregistrement dans une table doit être également ajouté dans une autre.

Voila ou j'en suis

[code php]
<?php
$dbhost = 'localhost';
$dbuser = 'root';
$dbpass = '';

$conn = mysql_connect($dbhost, $dbuser, $dbpass) or die                      ('Error connecting to mysql');

$dbname = 'satis';
mysql_select_db($dbname);


if (($handle = fopen("glpi.csv", "r")) !== FALSE)
{
   while (($data = fgetcsv($handle, 1000, ";")) !== FALSE)
   {
   
        $nameequipement    = $data[0];
        $lieu   = $data[1];
        $pcname   = $data[2];
        $mac    = $data[3];
        $serialnumber   = $data[4];
        $mobile   = $data[5];
        $fabricant  = $data[6];
        $osname     = $data[7];
        $detail        = $data[8];
       
        $cas_particulier= explode(">",$lieu);
        $batiment    = $cas_particulier[0];
        $etage       = $cas_particulier[1];
        $roomname   = $cas_particulier[2];
     
        // INSERTION DES SALLES
        // Verification des doublons
        $query = "SELECT max(id_room) FROM room";
        $result = mysql_query($query);
        $data= mysql_fetch_array($result);
       
        $comteur_id_room = $data[0]
       
       
        $sqlv1 = "SELECT roomname FROM room WHERE roomname='$roomname'";
        $reqv1 = mysql_query($sqlv1) or die('Verification de l\'existance de doublons de salle impossible<br/>'.mysql_error());
        $doublon_salle = mysql_fetch_array($reqv1);

        if($doublon_salle==true)
        {
            echo "<li>La salle <strong> '$roomname'</strong> existe déjà dans nos bases</li>";
        }
        else
        {
            $requete = "INSERT INTO room (roomname) VALUES ('$roomname')";
            $req = mysql_query($requete) or die('Impossible de créer une salle<br/>'.mysql_error());
            echo $roomname. ' a été ajouté';
           
            $comteur_id_room+1;
           
        }
       
        echo $compteur_id_room;
       
        // INSERTION DES OS
        // Verification des doublons
        $sqlv2 = "SELECT osname FROM os WHERE osname='$osname'";
        $reqv2 = mysql_query($sqlv2) or die('Verification de l\'existance de doublons de systeme d\'exploitation impossible<br/>'.mysql_error());
        $doublon_osname = mysql_fetch_array($reqv2);
       
        if($doublon_osname==true)
        {
            echo "<li>Le systeme '$osname' existe déjà dans nos bases</li>";
        }
        else
        {
            $requete = "INSERT INTO os (osname) VALUES ('$osname')";
            $req = mysql_query($requete) or die('Impossible de créer un os<br/>'.mysql_error());
            echo $osname. ' a été ajouté';
        }
       
        // INSERTION DE LA CONFIGURATION
        // Verification des doublons
        $sqlv3 = "SELECT pcname FROM pc WHERE pcname='$pcname'";
        $reqv3 = mysql_query($sqlv3) or die('Verification de l\'existance de doublons de configuration impossible<br/>'.mysql_error());
        $doublon_pcname = mysql_fetch_array($reqv3);
       
        if($doublon_pcname==true)
        {
            echo "<li>La configuration '$pcname' existe déjà dans nos bases</li>";
        }
        else
        {
            $requete = "INSERT INTO pc (pcname,detail) VALUES ('$pcname','$detail')";
            $req = mysql_query($requete) or die('Impossible de créer une configuration<br/>'.mysql_error());
            echo $pcname. ' a été ajouté';
        }
       
        // INSERTION DE L'EQUIPEMENT
        // Verification des doublons
        $sqlv4 = "SELECT mac FROM equipement WHERE mac='$mac'";
        $reqv4 = mysql_query($sqlv4) or die('Verification de l\'existance de doublons d\'adresse Mac impossible<br/>'.mysql_error());
        $doublon_mac = mysql_fetch_array($reqv4);
       
        if($doublon_mac==true)
        {
            echo "<li>L\'adresse Mac '$mac' existe déjà dans nos bases</li>";
        }
        else
        {
            $requete = "INSERT INTO equipement (serialnumber, nameequipement, mac, id_room, id_pc, mobile)
                        VALUES ('$serialnumber','$nameequipement','$mac','$id_room','$id_pc','$mobile')";
            $req = mysql_query($requete) or die('Impossible de créer une configuration<br/>'.mysql_error());
            echo $nameequipement. ' a été ajouté';
        }
   
   

    }
    fclose($handle);
}

   

?>

[/code]

Comme on peu le voir, Ma méthode de recherche de doublon et répétitive, je vais donc essayer de fabriquer une fonction afin d'éclaircir ca.
Deuxièmement après certain enregistrement, je vais devoir récupérer l'id de ce dernier afin de l'insérer dans d'autre table. d'ou mes essais  (ligne 36) qui au passage ne marche pas terrible ^^

$query = "SELECT max(id_room) FROM room";
    $result = mysql_query($query);
    $data= mysql_fetch_array($result);
   
    $comteur_id_room = $data[0]

Dernière modification par meche (08-03-2010 18:57:44)

Hors ligne

#8 09-03-2010 10:03:08

Maljuna Kris
Infantimigulo
Lieu : Douarnenez 29100 Breizh Izel
Inscription : 08-05-2009
Messages : 2 453
Site Web

Re : Php, lecture fichier csv pour insertion Mysql

Saluton,
Un petit coup de pouce :
mysql__insert_id()


Gloire à qui n'ayant pas d'idéal sacro-saint,
Se borne à ne pas trop emmerder ses voisins. G. Brassens Don Juan 1976.
Avĉjo MoKo kantas
La chaîne YouTube MoKo Papy

Hors ligne

#9 09-03-2010 23:13:14

meche
Membre
Inscription : 25-02-2010
Messages : 5

Re : Php, lecture fichier csv pour insertion Mysql

Merci beaucoup !! Cette fonction a l'air très interessante, et surtout utile pour la suite  !!

D'ailleur je suis tombé la dessus INSERT ... ON DUPLICATE KEY UPDATE , j'imagine que cela pourrai me servir pour verifier si un enregistrement équivalent existe deja dans ma table.

Hors ligne

Pied de page des forums