IMPORTER CSV VERS BASE

cs_jeca Messages postés 341 Date d'inscription mercredi 17 juillet 2002 Statut Membre Dernière intervention 14 juillet 2011 - 2 déc. 2004 à 11:26
67geek67 Messages postés 5 Date d'inscription vendredi 21 août 2009 Statut Membre Dernière intervention 28 septembre 2009 - 28 sept. 2009 à 11:28
Cette discussion concerne un article du site. Pour la consulter dans son contexte d'origine, cliquez sur le lien ci-dessous.

https://codes-sources.commentcamarche.net/source/27837-importer-csv-vers-base

67geek67 Messages postés 5 Date d'inscription vendredi 21 août 2009 Statut Membre Dernière intervention 28 septembre 2009
28 sept. 2009 à 11:28
Pour sauter la première ligne, placer le
$cpt++;
à la fin de la boucle
if ($champs0!='')
et placer derrière ce dernier une boucle
if ($cpt!=0)
qui se ferme juste avant le
$cpt++;
C'est pas compliqué(une meilleure façon existe peut-être) mais ça fera gagner du temps à certains...
axelkam Messages postés 1 Date d'inscription samedi 15 avril 2006 Statut Membre Dernière intervention 21 septembre 2007
21 sept. 2007 à 12:58
voila une solution que j'ai mis en ligne, elle a ete testée et elle marche :

http://www.commentcamarche.com/forum/affich-3111596-importation-fichier-csv-dans-mysql-php

bon courage
marsab Messages postés 1 Date d'inscription samedi 21 mai 2005 Statut Membre Dernière intervention 24 juin 2005
24 juin 2005 à 23:09
Bonjour,
je débute en php j 'ai déjà essayé quelques sripts ( news mots passes) ,mais celui ci je n'y arrive pas.
J ai mis le script sur multimania j ouvre "entrer_fichier.php" puis
"Importation Réussie"
"ERREUR DE REQUETE SUR LA BASE. " les 2 messages obtenus.
avant sur le serveur j 'ai créé une base avec 3 champs
J'ai aussi configuré "connexion.php" mais j'hésite pour cette ligne "$hostname_smoby = "ftp.membres.lycos.fr"; // nom de votre serveur ??

Pouvez vous me donner un coup de main

Merci
xabivalencia Messages postés 34 Date d'inscription jeudi 14 octobre 2004 Statut Membre Dernière intervention 23 juin 2005
23 juin 2005 à 00:21
salut candice....
je pense que ca va prendre du temps de traiter 45000lignes ms bon, ca devrait aller....sinon pour ton souci de la 5 eme ligne, tu pourrais faire un compteur et une fois q la variable est a 5, tu commences les enregistrements le tout grace a une commande "while"....enfin, faut tester.
Ciao et bonne continuation
candice9 Messages postés 14 Date d'inscription vendredi 17 juin 2005 Statut Membre Dernière intervention 29 décembre 2005
22 juin 2005 à 16:53
Salut!
j'aimerais que l'enregistrement dans la base commence a partir de la 5e ligne de mon fichier csv. comment faire?
et est ce que ce script est adapte pour des fichiers de plus de 45000 lignes?
merci bcp!
candice9 Messages postés 14 Date d'inscription vendredi 17 juin 2005 Statut Membre Dernière intervention 29 décembre 2005
22 juin 2005 à 16:49
salut!
j'aimerais commencer l'importation qu'a partir de la 5e ligne de mon fichier csv. comment faire?
et est ce que ce script est adapte pr des fichiers de plus de 450000 lignes a enregistrer ds la BD?
merci bcp!
zenabN Messages postés 3 Date d'inscription jeudi 16 décembre 2004 Statut Membre Dernière intervention 17 juin 2013
14 juin 2005 à 01:27
Bonjour/soir

est ce que vous parvenez a inserer un fichier ou il y a des champs vides ?
Dans mon fichier j ai 11 champs et une 20aines de lignes. Les champs 1 à 6 sont remplis , le 7,8,9,10 sont vides, le 11 est remplis.

En utilisant ce script, j insere dans ma base uniquement 7 lignes (au lieu des 20) et pas non plus mon 11eme champs...

Que dois je faire?
Merci de votre precieuse aide.
zenabN Messages postés 3 Date d'inscription jeudi 16 décembre 2004 Statut Membre Dernière intervention 17 juin 2013
14 juin 2005 à 01:23
Bonjour/soir

est ce que vous parvenez a inserer un fichier ou il y a des champs vides ?
Dans mon fichier j ai 11 champs et une 20aines de lignes. Les champs 1 à 6 sont remplis , le 7,8,9,10 sont vides, le 11 est remplis.

En utilisant ce script, j insere dans ma base uniquement 7 lignes (au lieu des 20) et pas non plus mon 11eme champs...

Que dois je faire?
Merci de votre precieuse aide.
djatomix1 Messages postés 30 Date d'inscription samedi 24 janvier 2004 Statut Membre Dernière intervention 13 mars 2009
9 juin 2005 à 10:47
Il y a une erreur dans ton code, insert into ... champs2 et 3 non pas de "s".
j'avais besoin de la première colone dans mon tableau en rajoutant : $liste[0] = ( isset($liste[0]) ) ? $liste[0] : Null;

Nikel sinon!
Merci
cs_julik Messages postés 22 Date d'inscription jeudi 4 novembre 2004 Statut Membre Dernière intervention 14 décembre 2004
14 déc. 2004 à 17:38
Bonsoir,
Je ne vois pas comment intégrer "/n" au code...
Vous pourriez m'éclaircir?
Je veux simplemnt sauter la première ligne du fichier .csv

Merci
Julien
xabivalencia Messages postés 34 Date d'inscription jeudi 14 octobre 2004 Statut Membre Dernière intervention 23 juin 2005
14 déc. 2004 à 15:08
Faire un formulaire de saisie sous excel??? va falloir employer des macro VBA.

Pour le nom de tes champs, tu peux sauter une ligne avec "/n" , et lire apres donc....
cs_julik Messages postés 22 Date d'inscription jeudi 4 novembre 2004 Statut Membre Dernière intervention 14 décembre 2004
14 déc. 2004 à 14:04
J'ai réussi à régler le problème en faisant des echos...
Il y avait simplement quelques erreurs de chiffres dans le code en plus de celle que tu m'as dite.
J'ai néanmoins encore une question.
J'aimerais faire un formulaire de saisie sous excel. Ainsi je voudrais mettre le nom des champs dans la première ligne. Comment pourrais-je procéder pour sauter la première ligne du fichier .csv?

MErci
Julien
xabivalencia Messages postés 34 Date d'inscription jeudi 14 octobre 2004 Statut Membre Dernière intervention 23 juin 2005
14 déc. 2004 à 13:02
deja, il y avait une erreur dans le code, remplaces ceci:
$liste[1] = ( isset($liste[2]) ) ? $liste[1] : Null;

par cela:

$liste[1] = ( isset($liste[1]) ) ? $liste[1] : Null;

Normalement, le code fonctionne, je te conseille tout d abord de faire de echo des liste[] puis des echos de tes variables comme ca, tu verras deja si elles sont vides des le depart ou perdues en route.
cs_julik Messages postés 22 Date d'inscription jeudi 4 novembre 2004 Statut Membre Dernière intervention 14 décembre 2004
14 déc. 2004 à 12:51
SAlut,
Les paramétres de connexion sont bien réglés. La preuve en est qu'il y a bien des entrées qui sont ajoutées dans la base (le bon nombre, mais vide... à part id autoincrémenter....).
Pour ce qui concerne le fichier "import_requete", j'ai simplement modifié la requête sql :
$query = "INSERT INTO bdd (champs1,champs2,champs3) VALUES('','$champ2','$champ3')";
en
$query ="INSERT INTO test (id,nom,lieu) VALUES('','$champ2','$champ3')"
id, nom et lieu étant les champs de ma table test...
Qu'en penses-tu?
xabivalencia Messages postés 34 Date d'inscription jeudi 14 octobre 2004 Statut Membre Dernière intervention 23 juin 2005
14 déc. 2004 à 12:35
Tout d abord, verifies bien que les parametres du fichier connexion soient bien reglés. Ensuite si tu as changé des noms de variables dans le fichier "import_requete", verifies les une nouvelle fois.

tiens mois au courant.

Xabi
cs_julik Messages postés 22 Date d'inscription jeudi 4 novembre 2004 Statut Membre Dernière intervention 14 décembre 2004
14 déc. 2004 à 12:22
Bonjour,
CE code a l'air très bien, mais j'ai un soucis dans son utilisation. Peut-être du fait que je suis un brin débutant en php..
J'utilise sur fichier .csv de 3 entrées.
Il m'enregistre bien 3 entrées dans ma table, mais ces 3 entrées contiennent des champs vides (hormis l'id qui s'autoincrémente...)
Auriez-vous une idée de l'origine de ce problème? Moi je cale...
MErci
Julien
xabivalencia Messages postés 34 Date d'inscription jeudi 14 octobre 2004 Statut Membre Dernière intervention 23 juin 2005
2 déc. 2004 à 15:37
ma source ne correspond plus vraiment a ce que je fais....a l epoque, je remplacais si il y avait doublon, a presnt, s il y a un doublon...je le dis a l user mais je ne le change pas dans la base, je lui indique l enregistrement dans la base qui empechait son enregistrement.
xabivalencia Messages postés 34 Date d'inscription jeudi 14 octobre 2004 Statut Membre Dernière intervention 23 juin 2005
2 déc. 2004 à 15:35
ben c est la justement le truc....c est que je ne veux pas "remplace" l 'enregistrement qui a la meme cle dans ma base....
xabivalencia Messages postés 34 Date d'inscription jeudi 14 octobre 2004 Statut Membre Dernière intervention 23 juin 2005
2 déc. 2004 à 15:21
J ai mis la clef sur 3 champs mais ca marche pas du tout avec ta requete...ca me fait une erreur de requete a chaque fois...
cs_jeca Messages postés 341 Date d'inscription mercredi 17 juillet 2002 Statut Membre Dernière intervention 14 juillet 2011 14
2 déc. 2004 à 13:41
C'est tout à fait applicable :

Tu déclares comme clé unique les colonnes de la table dans lesquelles tu ne veux pas de doublons.

Et tu modifie la requête :

$sql = "LOAD DATA INFILE '$filename' " .
"REPLACE " .
"INTO TABLE laTable " .
"FIELDS TERMINATED BY ',' " .
"LINES TERMINATED BY ' '";

Avec "replace", l'enreg. qui arrive remplace celui qui existe déjà avec la même clé.
xabivalencia Messages postés 34 Date d'inscription jeudi 14 octobre 2004 Statut Membre Dernière intervention 23 juin 2005
2 déc. 2004 à 13:06
Ok j avais pas capté mais le souci est que c est pas vraiment applicable dans mon cas car ca voudrait dire que j inserer tout le fichier dans ma base....et c est que je veux faire mais en verifiant que les donnees du fichier ne peuvent faire doublon avec ma base.

En consequent, pas applicable a mon cas....
cs_jeca Messages postés 341 Date d'inscription mercredi 17 juillet 2002 Statut Membre Dernière intervention 14 juillet 2011 14
2 déc. 2004 à 12:44
Ce n'est pas la source du code que je voulais te faire voir, mais mon commentaire :

les lignes d'importation pourraient avantageusement être remplacée par cette requète :

$sql = "LOAD DATA INFILE '$filename' " .
"INTO TABLE kill_country " .
"FIELDS TERMINATED BY ',' " .
"LINES TERMINATED BY ' '";

Testé sur serveur PIII 500
fichier : ip-to-country.csv
45 000 enreg. et 5 champs

temps d'éxécution :
la fonction du code : 47 à 48 secondes
la requète : 0.5 à 0.6 seconde

et principalement la différence de temps d'éxécution entre une fonction comme la tienne et la requête : le rapport est de presque 1 à 100.
xabivalencia Messages postés 34 Date d'inscription jeudi 14 octobre 2004 Statut Membre Dernière intervention 23 juin 2005
2 déc. 2004 à 12:13
j ai regarde ton lien....il fait la meme chose sauf que je fe des test sur ce que l on insere dans la base pour eviter doublon suivant certains champs....

Concernant le temps requis, ca depend du nombre de ligne et si toutes les cases sont remplies...

Neanmoins, merci pour le commentaire...

Xabi
cs_jeca Messages postés 341 Date d'inscription mercredi 17 juillet 2002 Statut Membre Dernière intervention 14 juillet 2011 14
2 déc. 2004 à 11:26
Une simple requête sql "load data infile" fait la même chose que "import_requete.php", avec des temps d'éxécution sans commune mesure.

Un exemple ici pour un fichier d'environ 45000 lignes :
http://www.phpcs.com/code.aspx?id=13434
Rejoignez-nous