par
Jibe » 14 sept. 2011, 16:11
Bonjour,
J'ai une question à propos de l'importation de fichier csv dans une base de données mysql. Actuellement j'ai un script qui permet de lire un fichier csv et d'importer les données contenues dedans dans ma base.
En revanche avant l'importation j'ai du traitement à faire, du coup il n'y a pas toujours toutes les lignes du fichier csv qui sont importées dans la base.
J'aimerai donc savoir si il est possible d'afficher un tableau avec les lignes qui ont été importées et en dessous un tableau avec les lignes qui n'ont pas été importées ou bien un code qui permettrait d'afficher toutes les lignes du fichier csv et selon si elles ont été importées ou non mettre OK ou ERREUR par exemple.
Voici mon code actuel :
// <?php importation
fgetcsv($fp, 4096, ",");
while (!feof($fp))
{
$ligne = fgets($fp,4096);
// on crée un tableau des élements séparés par des points virgule
$liste = explode(";",$ligne);
// premier élément
$liste[0] = ( isset($liste[0]) ) ? $liste[0] : Null;
$liste[1] = ( isset($liste[1]) ) ? $liste[1] : Null;
$liste[2] = ( isset($liste[2]) ) ? $liste[2] : Null;
$liste[3] = ( isset($liste[3]) ) ? $liste[3] : Null;
$liste[4] = ( isset($liste[4]) ) ? $liste[4] : Null;
$liste[5] = ( isset($liste[5]) ) ? $liste[5] : Null;
$liste[6] = ( isset($liste[6]) ) ? $liste[6] : Null;
$champs1=$liste[0]; // matricule
$champs2=$liste[1]; // nom
$champs3=$liste[2]; // prenom
$champs4=$liste[3]; // libfct
$champs5=$liste[4]; // libfctbis
$champs6=$liste[5]; // libmet
$champs7=$liste[6]; // date
$champs7 = trim($champs7);
// pour eviter qu un champs "nom" du fichier soit vide
if ($champs1!='')
{
// nouvel ajout, compteur incrémenté
//$cpt++;
// requete et insertion ligne par ligne
// champs1 id en general dc on affecte pas de valeur
$res = $bdd->query("SELECT fonction.codefct, fonction.libfct, fonction_bis.codefct as codefctbis, fonction_bis.libfctbis, metier.codemet, metier.libmet FROM fonction, fonction_bis, metier
WHERE fonction.libfct = '$champs4' AND fonction_bis.libfctbis = '$champs5' AND metier.libmet = '$champs6'");
while($te = $res->fetch())
{
$codef = $te['codefct'];
$libf = $te['libfct'];
$codefbis = $te['codefctbis'];
$libfbis = $te['libfctbis'];
$codem = $te['codemet'];
$libm = $te['libmet'];
if($champs4 == $libf && $champs5 == $libfbis && $champs6 == $libm)
{
$dated = explode("/", $champs7);
$jour = $dated[0];
$mois = $dated[1];
$annee = $dated[2];
$champs7 = $annee.'-'.$mois.'-'.$jour;
//$bdd->exec("INSERT INTO collaborateur(matricule, nom, prenom, codefct, codefctbis, codemet, date) VALUES('$champs1','$champs2','$champs3','$codef','$codefbis','$codem','$champs7' )");
}
}
$sql = $bdd->query('SELECT * FROM collaborateur ');
?>
<table>
<tr>
<td><?php /*echo $liste[0];?></td>
<td><?php echo $liste[1];?></td>
<td><?php echo $liste[2];?></td>
<td><?php echo $liste[3];?></td>
<td><?php echo $liste[4];?></td>
<td><?php echo $liste[5];?></td>
<td><?php echo $liste[6];*/?></td>
</tr>
</table>
<?php
}
}
// fermeture du fichier
fclose($fp);
//on supprime la derniere car elle est vide
L'idée c'est qu'à partir des données du fichier CSV, je fasse les traitements suivants :
- vérifier si le matricule existe déjà dans la table collaborateur, si c'est le cas on saute la ligne
- vérifier si le libfct existe dans la table fonction, si il n'existe pas, on saute la ligne
- vérifier si le libfctbis existe dans la table fonction_bis, si il n'existe pas, on saute la ligne
- vérifier que le libmet existe dans la table metier, si il n'existe pas, on saute la ligne
Sinon on insère les données.
Ensuite avoir un récapitulatif des lignes insérées et celles non insérées.
Merci
Bonjour,
J'ai une question à propos de l'importation de fichier csv dans une base de données mysql. Actuellement j'ai un script qui permet de lire un fichier csv et d'importer les données contenues dedans dans ma base.
En revanche avant l'importation j'ai du traitement à faire, du coup il n'y a pas toujours toutes les lignes du fichier csv qui sont importées dans la base.
J'aimerai donc savoir si il est possible d'afficher un tableau avec les lignes qui ont été importées et en dessous un tableau avec les lignes qui n'ont pas été importées ou bien un code qui permettrait d'afficher toutes les lignes du fichier csv et selon si elles ont été importées ou non mettre OK ou ERREUR par exemple.
Voici mon code actuel :
[php]
// <?php importation
fgetcsv($fp, 4096, ",");
while (!feof($fp))
{
$ligne = fgets($fp,4096);
// on crée un tableau des élements séparés par des points virgule
$liste = explode(";",$ligne);
// premier élément
$liste[0] = ( isset($liste[0]) ) ? $liste[0] : Null;
$liste[1] = ( isset($liste[1]) ) ? $liste[1] : Null;
$liste[2] = ( isset($liste[2]) ) ? $liste[2] : Null;
$liste[3] = ( isset($liste[3]) ) ? $liste[3] : Null;
$liste[4] = ( isset($liste[4]) ) ? $liste[4] : Null;
$liste[5] = ( isset($liste[5]) ) ? $liste[5] : Null;
$liste[6] = ( isset($liste[6]) ) ? $liste[6] : Null;
$champs1=$liste[0]; // matricule
$champs2=$liste[1]; // nom
$champs3=$liste[2]; // prenom
$champs4=$liste[3]; // libfct
$champs5=$liste[4]; // libfctbis
$champs6=$liste[5]; // libmet
$champs7=$liste[6]; // date
$champs7 = trim($champs7);
// pour eviter qu un champs "nom" du fichier soit vide
if ($champs1!='')
{
// nouvel ajout, compteur incrémenté
//$cpt++;
// requete et insertion ligne par ligne
// champs1 id en general dc on affecte pas de valeur
$res = $bdd->query("SELECT fonction.codefct, fonction.libfct, fonction_bis.codefct as codefctbis, fonction_bis.libfctbis, metier.codemet, metier.libmet FROM fonction, fonction_bis, metier
WHERE fonction.libfct = '$champs4' AND fonction_bis.libfctbis = '$champs5' AND metier.libmet = '$champs6'");
while($te = $res->fetch())
{
$codef = $te['codefct'];
$libf = $te['libfct'];
$codefbis = $te['codefctbis'];
$libfbis = $te['libfctbis'];
$codem = $te['codemet'];
$libm = $te['libmet'];
if($champs4 == $libf && $champs5 == $libfbis && $champs6 == $libm)
{
$dated = explode("/", $champs7);
$jour = $dated[0];
$mois = $dated[1];
$annee = $dated[2];
$champs7 = $annee.'-'.$mois.'-'.$jour;
//$bdd->exec("INSERT INTO collaborateur(matricule, nom, prenom, codefct, codefctbis, codemet, date) VALUES('$champs1','$champs2','$champs3','$codef','$codefbis','$codem','$champs7' )");
}
}
$sql = $bdd->query('SELECT * FROM collaborateur ');
?>
<table>
<tr>
<td><?php /*echo $liste[0];?></td>
<td><?php echo $liste[1];?></td>
<td><?php echo $liste[2];?></td>
<td><?php echo $liste[3];?></td>
<td><?php echo $liste[4];?></td>
<td><?php echo $liste[5];?></td>
<td><?php echo $liste[6];*/?></td>
</tr>
</table>
<?php
}
}
// fermeture du fichier
fclose($fp);
//on supprime la derniere car elle est vide
[/php]
L'idée c'est qu'à partir des données du fichier CSV, je fasse les traitements suivants :
- vérifier si le matricule existe déjà dans la table collaborateur, si c'est le cas on saute la ligne
- vérifier si le libfct existe dans la table fonction, si il n'existe pas, on saute la ligne
- vérifier si le libfctbis existe dans la table fonction_bis, si il n'existe pas, on saute la ligne
- vérifier que le libmet existe dans la table metier, si il n'existe pas, on saute la ligne
Sinon on insère les données.
Ensuite avoir un récapitulatif des lignes insérées et celles non insérées.
Merci