Bonsoir,
Voila ce que moi j ai fais pour importer pas mal de donnees aussi:
esperant que cela puisse te servir
Gilles
Bonjour,
J'aimerais mettre à jour une table de ma base de donnée via un fichier csv que j'upload depuis une page php.
J'ai regardé un peut sur le web mais ce que je trouve ne fonctionne pas chez moi, je pense que le problème viendrais de la taille du fichier.
Ce fichier fait 12Mo, j'ai réussi à faire un move_uploaded_file() mais le fichier est vide une foi déplacé.
Voici un bout de code :
Je tiens à préciser (pas encore eu le temps de regarder) j'aimerais en lever la première ligne qui correspond à l'entête des colonnes.
Il y a beaucoup de colonne, lors de l'insert est ce que je dois indiquer toutes les colonnes? ou y a t-il une autre fonction pour le csv ?
Bonsoir,
Voila ce que moi j ai fais pour importer pas mal de donnees aussi:
esperant que cela puisse te servir
Gilles
Merci je vais essayer !
Bon mon problème c'est que je ne passe pas la première condition :
Je ne comprend pas, je fais un simple formulaire
$form->imput fait appel a une classe qui génére le formulaire (nom, label, option->type, require)
Donc je ne comprends pas ! c'est à dire que je charge mon fichier, lorsque je valide, le fichier disparait en faisant des tests, je n'ai pas de fichier !
Bon là je suis dans le floue !!!
j'ai mon input de type file avec name=csv
Dans mon controller, j'ai fait une condition pour voir si je recevais bien une method post, ce qui est le cas !
Juste derrière, je fais un var_dump($_FILES['csv']); die;
j'obtiens une belle erreur Undefined index: csv
Si quelqu'un a une idée !!!???
Hello,
Dans un premier temps, essai d'uploader un petit fichier.
A mon avis, tu as un soucis de taille. Vérifie ta configuration PHP si tu as un upload_max_filesize et post_max_size défini a 12M (ou plus).
Par contre, cela devrait t'afficher une erreur. As tu activé l'affichage des erreurs ?
Ok c'est bien ça, mais je suis sous wamp donc facile a configurer, mais sur un hebergement ovh comment fait-on?
Si tu es sur un mutualisé, il va falloir aller voir avec PHPINFO() la taille définie. Il ne me semble pas que tu puisse le modifier.
Par contre, si tu prend un dédié, tu fais ce que tu veux avec, donc pas de soucis de ce côté là.
Bon autre problème, J'ai un problème mémoire lorsque je rentre dans cette boucle
llowed memory size of 536870912 bytes exhausted
Mon fichier csv doit contenir un peut plus de 1000 lignes
Il s'agit d'un soucis d'allocation mémoire. Il faut changer ton param memory_limit du PHP.ini.
je l'ai déjà augmenté, peut être pas assai !
peut être pas assez** !
As combien est la valeur actuellement ?
Bon une dernière question, une foi à cette étape :
Je dois inserer en base de donnée les résultats.
dans mon var_dump($i, $line); j'obtiens :
Donc je dois déjà supprimer cette ligne qui correspond aux entête de ma table et surtout comment faire pour ne pas a devoir taper les champs à remplir, il y en a 70 :(
j'ai passé la valeur a 900M et ça fonctionne
Un conseil, ne met pas une valeur au pifomètre ... 900M de mémoire a alloué, ca commence à faire beaucoup.
Joue un peu avec réduit jusqu'a temps d'avoir une erreur, et augmente un peu après histoire de prendre une marge de sécurité.
En ce qui concerne ta question, une petite recherche sur le net rapidement t'aurais donné la solution :
http://stackoverflow.com/questions/578037/how-do-i-remove-the-top-line-in-a-csv-file-the-coloumn-headers
Ok en faisant les tests, 600M correspond à la limite !
pour la solution que tu m'as donné, en fait ça n'ai pas vraiment le problème là que je souhaitais mettre en avant, mais le fait de faire un insert avec 70 colones a renseigner ! mais de toute façon je pense ne pas avoir le choix !
Pour finir, je te conseil de lire ceci : http://www.developpez.net/forums/d1184103/php/php-sgbd/php-mysql/importer-csv-php-bdd/
En effet, l'import en ligne de commande, permettrait de ne pas pomper toute la RAM de ton serveur (ca pompera moins en tout cas).
Après, si tu es sur un mutualisé, ce n'est pas possible.
Si ton sujet est résolu, n'hésite pas à marquer la / les réponses qui t'ont aidés.
Oui je l'avais vue ! Seulement je suis sur un mutualisé.
Je fais encore 2 ou 3 tests et je passe en résolu !
Salut,
Je pense que ton problème sera résolu rapidement, mais je ne comprends pas en quoi un "LOAD DATA" ne fonctionnerait pas sur un mutualisé ?
Tu rapatrie ton fichier CSV sur ton serveur, puis tu fais un requête SQL "LOAD DATA LOCAL INFILE ''chemin/absolu/local/tonfichier.csv' INTO TABLE 'taTable' ... " (ne pas oublier le LOCAL !)
Tu as un paramètre pour enlever ta première ligne (IGNORE 1 LINES) - je te laisse regarder la doc de cette fonction ici : http://dev.mysql.com/doc/refman/5.7/en/load-data.html
En tout cas ça fonctionne sur du mutualisé OVH, et c'est beaucoup rapide ! surtout sur un mutualisé où les ressources peuvent être problématique, et tu n'as plus trop besoin de te soucier d'un problème qui pourrait arriver si ton fichier grossit (augmenter tes valeurs memory_limit etc ...)
En fait j'ai un autre problème, c'est que lors de mon var_dump($i, $line); je me rends compte que la colone 70 est incomplète. v au lieu de validation. de plus après cette ligne, il y a encore pas mal de colone !
Comme je l'ai dit, c'est une grosse table, une table dont je n'ai que accès par export csv :(
Bon j'ai essayé avec LOAD DATA.
J'essaie de l'incorporer à mon model MVC vue sur ce site. Seulement j'ai une erreur du type
j'ai vue sur certain forum que le LOCAL peut poser problème, dans mon cas, j'obtiens une autre erreur si je l'enlève.
Bon je progresses mais pas encore eu le resultat que je cherches !
J'arrives à mettre les données dans la bdd, seulement j'ai uniquement la première colone de remplit, le reste est a NULL.
Pour info, lorsque j'importe le fichier directement depuis phpmyadmin, ça se passe très bien ! Une idée?
Vérifie tes séparateurs qu'ils correspondent bien à tes paramètres de la requete, exemple :
Sinon, bien vérifier que les colonnes correspondent trait pour trait au CSV.
pfffff ça m'agasse de tomber a chaque foi sur un prob !!!
Voici la requette qui fonctionne dans phpmyadmin :
mon code
pour ENCLOSED BY '\"' j'echape la double quote je ne sais pas si ça vient de là mais j'ai une erreur de syntax
Je pense que le soucis vient de ESCAPED BY '\\'.
Si tu copie ta requête est tu fait un echo, voilà ce que ça donne :
Donc il te faut rajouter deux \ dans ESCAPED BY
Ce qui donnerais :
Franchement merci de ton aide, je n'avais pas pensé à regarder en faisant un echo ! Du coup tout fonctionne, je peux enfin avancer !!! Merci beaucoup.