Import CSV vers mySQL

Résolu/Fermé
nadia451 Messages postés 11 Date d'inscription jeudi 3 mai 2012 Statut Membre Dernière intervention 24 mai 2012 - 23 mai 2012 à 09:11
 Alpha Streetlive - 26 juin 2014 à 14:12
Bonjour,

J'essaie depuis quelques jours d'importer un fichier CSV dans ma base de données, mais plusieurs bug m'empêche d'avance.

Mon fichier est importer que partiellement, c'est à dire, certaines date ne sont pas enregistrées et sont toutes remplacées par 1970-01-01 (unix time), donc je pense que le problème vient du format des cellules date dans mon .CSV mais même en essayant de reformater toutes ces cellule ça marche toujours pas.

Deuxième soucis : j'ai une colonne 'description' qui contient des chaines de caractère mais dedans il y'à des * et des long commentaires !! L'import ne se fait donc pas =(.

Un dernier soucis : quand je réussis à faire un import, j'ai toujours des lignes vides qui se rajoute à la fin de ma table mySQL =(

quelqu'un pour m'aider ??

je vous mets le code de mon fichier import.php : userFile est le fichier .CSV sélectionné par l'utilisateur dans une autre page !



<?php 
include('./include/Connection.inc.php');
include('./include/script.inc.php');

$fichier = $_FILES['userFile']['name'];
//$fichier = 'test.csv';  
if(move_uploaded_file($_FILES['userFile']['tmp_name'], $fichier)) {
    if (file_exists($fichier))
        $fp = fopen("$fichier", "r");
    else{ // fichier inconnu
        echo "Fichier introuvable !<br>Importation stoppe.";
        exit();
    } 
   
      // on cree un tableau des elements separe par point virgule
   while (!feof($fp)){
        $ligne = fgets($fp, 4096);
        $liste = explode(";",$ligne);
        $debTrimmed = trim($liste[1]);
        $debu=date("y-m-d", strtotime($debTrimmed));
        $fin=date("y-m-d", strtotime($liste[3]));
        
        $req = $bdd->query("INSERT INTO import VALUES('".$liste[0]."', '".$debu."', '".$fin."', '".$liste[17]."', '".$liste[17]."', '".$liste[0]."', '')"); 
        //$req = $bdd->query("INSERT INTO import VALUES('$nom', '$dateDe', '$dateFi', '$desc', '$lieu', '$act', NULL);");     
        
    }
    $req->execute();
    $req->closeCursor();  
    fclose($fp);
   
    
    if ($req)
    {
        echo "Ajout dans la base de données effectué avec succès";
    }
    else
    {
        echo "Echec dans l'ajout dans la base de données";
    }
}

?>




Merci d'avance
A voir également:

13 réponses

Utilisateur anonyme
23 mai 2012 à 09:31
Bonjour

Si tu utilisais les fonctions faites pour CSV, tu aurais sans doute moins de problèmes...
Regarde la doc de la fonction fgetcsv() au lieu d'utiliser fgets.
Car le format CSV ne consiste pas simplement à séparer les champs par des ";" et le traitement que tu fais n'est pas correct.
0
nadia451 Messages postés 11 Date d'inscription jeudi 3 mai 2012 Statut Membre Dernière intervention 24 mai 2012
23 mai 2012 à 10:21
merci le père,

je vais reprendre mon code avec fgetcsv(), par contre quel traitement n'est pas bon ? l'enregistrement dans la base de données ou autre chose ?
0
Utilisateur anonyme
23 mai 2012 à 10:42
Ce qui n'est pas bon, c'est d'utiliser fgets et explode, car le format CSV ne se résume pas à l'insertion de ";" dans le texte.
Ce traitement 'naïf' oublie le cas où les valeurs contenues dans le fichier comportent certains caractères spéciaux, à commencer par les ";" eux-mêmes, mais aussi les espaces, les guillemets, les changements de ligne et j'en oublie sans doute.

Ma remarque ne portait pas sur l'enregistrement dans la base de données, mais puisque tu en parles...
Tu te rends compte que si une de tes données contient une apostrophe, ta requête va planter ? Utilise PDO::quote() pour échapper les caractères spéciaux, ou mieux, utilise une requête préparée.
0
nadia451 Messages postés 11 Date d'inscription jeudi 3 mai 2012 Statut Membre Dernière intervention 24 mai 2012
23 mai 2012 à 11:00
Dsl mais si je suis venue demander de l'aide ce qu'il y' à certainement des choses qui m'échappent donc non je ne me rendais pas compte que les caractères spéciaux allait poser problème.
Tu as bien raison car quand j'essaie d'importer une colonne qui contient des descriptions ma requête plante, je savais que ça venait des caractères spéciaux mais je voyais pas comment faire

merci de m'avoir aider
0
Utilisateur anonyme
23 mai 2012 à 11:18
Faut pas être désolée, le forum est là pour répondre aux questions :)
Tes problèmes sont-ils résolus ?
0
nadia451 Messages postés 11 Date d'inscription jeudi 3 mai 2012 Statut Membre Dernière intervention 24 mai 2012
24 mai 2012 à 11:43
Bonjour,
ça ne marche toujours pas, pour l'instant je travaille sur l'import des dates mais en vin,
certaines sont importées correctement mais pas d'autres :/
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Utilisateur anonyme
24 mai 2012 à 11:50
Peux-tu montrer ton code avec fgetcsv ?
Peux-tu mettre un échantillon de données (non confidentielles) avec Cjoint ou autre ?
0
nadia451 Messages postés 11 Date d'inscription jeudi 3 mai 2012 Statut Membre Dernière intervention 24 mai 2012
24 mai 2012 à 11:56
<?php 
include('./include/Connection.inc.php');
include('./include/script.inc.php');
date_default_timezone_set('Europe/Paris'); 

$fichier = $_FILES['userFile']['tmp_name'];
//$fichier = 'test.csv';  

    if (file_exists($fichier))
        $fp = fopen("$fichier", "r");
    else{ // fichier inconnu
        echo "Fichier introuvable !<br>Importation stoppe.";
        exit();
    } 
   
    while (($liste = fgetcsv($fp, 1000, ';')) !== FALSE){
       
        $deb = date("Y-d-m", strtotime($liste[1]));
        $debu = new DateTime($deb);
        $debu=$debu->format('Y-m-d');
        
        $finD = date("Y-d-m",strtotime($liste[3])); 
        $fin = new DateTime($finD);
        $fin=$fin->format('Y-m-d');
               
       // $descr = $bdd->quote($liste[16], PDO::PARAM_STR);
        
       $req = $bdd->exec("INSERT INTO import VALUES('".$liste[0]."', '".$debu."', '".$fin."', '".$liste[17]."', '".$liste[17]."', '".$liste[0]."', '')");      
       
       
    }

    fclose($fp);
    
    
    if ($req)
    {
        echo "Ajout dans la base de données effectué avec succès";
    }
    else
    {
        echo "Echec dans l'ajout dans la base de données";
    }
    


?>



je t'envoie un échantillon tout de suite.
Merci beaucoup pour tes réponses rapides
0
nadia451 Messages postés 11 Date d'inscription jeudi 3 mai 2012 Statut Membre Dernière intervention 24 mai 2012
24 mai 2012 à 12:00
0
nadia451 Messages postés 11 Date d'inscription jeudi 3 mai 2012 Statut Membre Dernière intervention 24 mai 2012
24 mai 2012 à 12:02
l'enregistrement dans ma bdd : https://www.cjoint.com/?0EymchUeK0c
0
Utilisateur anonyme
24 mai 2012 à 13:56
Je comprends !
J'aurais pu le voir avant...
L'importation se passe bien, ce qui ne va pas c'est ton traitement des dates.
La fonction strtotime attend une date au format américain, et tes dates sont au format français... Visiblement, dès que le jour du mois est supérieur à 12, il te donne un 0 (car pour lui ça doit être le mois) ,qui devient 1/1/70 quand tu retransformes 'en clair'.
N'utilise pas strtotime, fais ta propre fonction en utilisant explode ou substr.
0
Utilisateur anonyme
24 mai 2012 à 13:58
J'ajoute que tu as un problème d'encodage, mais c'est autre chose...
0
nadia451 Messages postés 11 Date d'inscription jeudi 3 mai 2012 Statut Membre Dernière intervention 24 mai 2012
24 mai 2012 à 14:10
d'accord en plus j'avais remarqué dans ma base de données que ça inversé les jours et les mois ! merci beaucoup je vais changer !
c'est quoi le problème de l'encodage ?
0
Tu as des ? à la place des é. Les données d'origine ont dû être traitées tantôt en utf8, tantôt en iso-8859-x, au gré des logiciels qui les ont manipulées.
C'est peut être facile à corriger si le fichier csv n'est pas trop volumineux, et si ton site est cohérent à ce sujet.
Et vive la natation (20 ans de pratique chez les maîtres ^^)
0
nadia451 Messages postés 11 Date d'inscription jeudi 3 mai 2012 Statut Membre Dernière intervention 24 mai 2012
24 mai 2012 à 14:46
D'accord, oui à chaque fois que je modifie mon fichier CSV je suis obligé de le ré-ouvrir avec un éditeur et de l'encoder en utf8 ! le problème vient surement de là !

Oui vive la natation, je suis en stage dans une organisation sportive donc voilà =)

Merci toutes mes dates sont importées au bon format maintenant !! =D

Je mets le code si jamais quelqu'un a le même soucis que moi !


<?php 
include('./include/Connection.inc.php');
include('./include/script.inc.php');
date_default_timezone_set('Europe/Paris'); 

$fichier = $_FILES['userFile']['tmp_name'];

function dateFR2US($date)
{
  $date = explode('/', $date);
  $date = array_reverse($date);
  $date = implode('-', $date);
  return $date;
}

    if (file_exists($fichier))
        $fp = fopen("$fichier", "r");
    else{ // fichier inconnu
        echo "Fichier introuvable !<br>Importation stoppe.";
        exit();
    } 
   
    while (($liste = fgetcsv($fp, 1000, ';')) !== FALSE){
      
        
        $deb = dateFR2US($liste[1]);
        $deb = date("Y-m-d", strtotime($deb));
        $debu = new DateTime($deb);
        $debu=$debu->format('Y-m-d');
        
        $finD = dateFR2US($liste[3]);
        $finD = date("Y-m-d",strtotime($finD)); 
        $fin = new DateTime($finD);
        $fin=$fin->format('Y-m-d');
        
       $req = $bdd->exec("INSERT INTO import VALUES('".$liste[0]."', '".$debu."', '".$fin."', '".$liste[17]."', '".$liste[17]."', '".$liste[0]."', '')");      
       
       
    }
    //  $req->closeCursor();  
   //   $req->execute();
   
    fclose($fp);
    
    
    
    if ($req)
    {
        echo "Ajout dans la base de données effectué avec succès";
    }
    else
    {
        echo "Echec dans l'ajout dans la base de données";
    }
    


?>
     
    
0
lagsurfer Messages postés 1 Date d'inscription lundi 8 octobre 2012 Statut Membre Dernière intervention 8 octobre 2012
8 oct. 2012 à 23:23
Bonjour, je suis désespérément à la recherche d'un script PHP simple me permettant de récupérer les NOM, PRENOM d'une liste d'élèves située dans un fichier .csv!!
Puis de les insérer dans ma table "eleves"... dont la structure est CODE_ELEVE, CODE_CLASSE, NOM, PRENOM

J'ai essayé d'utiliser et d'adapter votre code, mais n'utilisant pas les dates, je suis complètement perdu...

Pourriez vous m'aider?
Merci
Nico
0
qyounes1970 Messages postés 2 Date d'inscription jeudi 18 octobre 2012 Statut Membre Dernière intervention 18 octobre 2012
18 oct. 2012 à 19:14
je ne sais pas est-ce que ca peut t'aider.....

<?php

//connect to the database
$connect = mysql_connect("root","user","pass");
mysql_select_db("bdd",$connect); //select the table
//

if ($_FILES[csv][size] > 0) {

//get the csv file
$file = $_FILES[csv][tmp_name];
$handle = fopen($file,"r");

//loop through the csv file and insert into database
do {
if ($data[0]) {
mysql_query("INSERT INTO eleves (CODE_ELEVE, CODE_CLASSE, NOM, PRENOM) VALUES
(
'".addslashes($data[0])."',
'".addslashes($data[1])."',
'".addslashes($data[2])."',
'".addslashes($data[3])."'
)
");
}
} while($data = fgetcsv($handle, 10000, ",", "\""));
}

?>
0
Alpha Streetlive
26 juin 2014 à 14:12
Réponse deux ans plus tard!

N'oublies pas qu'un fichier CSV est manipulable sous excel! Tu peux simplement supprimer les lignes dont tu n'as pas besoin, faire des tris sur les données utiles, sauvegarder en CSV et importer à l'aide de PHPMyAdmin par exemple!

Pourquoi faire simple quand on peux faire plus simple?
0