Import CSV vers mySQL
Résolu
nadia451
Messages postés
11
Date d'inscription
Statut
Membre
Dernière intervention
-
Alpha Streetlive -
Alpha Streetlive -
A voir également:
- Import CSV vers mySQL
- Windows 7 vers windows 10 - Accueil - Mise à jour
- Mysql community server - Télécharger - Bases de données
- Clavier qwerty vers azerty - Guide
- Vers quelle adresse web renvoie ce lien - Guide
- Envoyer vers - Guide
13 réponses
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.
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.
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 ?
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 ?
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.
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.
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
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
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
Peux-tu montrer ton code avec fgetcsv ?
Peux-tu mettre un échantillon de données (non confidentielles) avec Cjoint ou autre ?
Peux-tu mettre un échantillon de données (non confidentielles) avec Cjoint ou autre ?
<?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
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.
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.
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 ^^)
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 ^^)
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 !
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"; } ?>
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
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
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, ",", "\""));
}
?>
<?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, ",", "\""));
}
?>
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?
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?