Vous n'êtes pas identifié(e).
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 )
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
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
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 )?!
Hors ligne
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 :
$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é 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
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
Maljuna Kris, j'ai regardé et essayer avec la méthode LOAD DATA INFILE de cette maniere :
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 )
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
Dernière modification par meche (25-02-2010 14:58:46)
Hors ligne
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
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
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