Page 1 sur 1

Importer un fichier CSV dans une base MySQL

Posté : 09 févr. 2011, 20:03
par Bruno21
Bonjour,

J'ai besoin d'importer un fichier CSV (en provenance d'une base MSSQL) dans une base MySQL. Ce fichier contient un champ Date au format JJ/MM/AAAA HH:MM:SS:MMM que je voudrais importer dans un champ datetime de ma nouvelle table MySQL

Avec la requête suivante, l'import se passe bien, sauf que comme le format de date n'est pas bon, toutes les dates sont mises à zero.
$query= "LOAD DATA INFILE '/Library/WebServer/Documents/file.csv' INTO TABLE `MaTable` FIELDS TERMINATED BY ';' LINES TERMINATED BY '\r\n' ";

J'ai contourné le problème en chargeant le CSV dans un tableau, en modifiant la date et en l'inserrant dans la table avec une succession de requete INSERT INTO MaTable.
Ca marchait jusqu'à ce que je récupère des .csv de 200000 lignes. Là, Firefox plante en cours d'import, Safari en importe 20% avant de sortir une erreur (Erreur réseau #-1001).

Ma question: est-il possible de modifier à la volée la date avec le LOAD DATA INFILE ?
Si non, avez-vous une astuce pour contourner le problème ?

Précision: à terme, le processus d'importation doit être réalisé par des utilisateurs très "basiques". Ca doit donc rester très simple et le plus transparent possible.

Désolé d'avoir été un peu long ...

Re: Importer un fichier CSV dans une base MySQL

Posté : 10 févr. 2011, 12:58
par Mazarini
Bonjour,

Pour des traitements long, le plus simple serait de déposer le fichier dans un répertoire et de le traiter à part. Tu crées une tache périodique qui vérifie la présence de fichiers et tu les traites via un appel à PHP mais en mode ligne de commande.

Il y a des règles à respecter pour traiter un fichier. La plus importante est de faire un premier traitement pour en vérifier le contenu. Lorsque le contenu est ok, il ne reste qu'a faire le chargement.

Re: Importer un fichier CSV dans une base MySQL

Posté : 10 févr. 2011, 20:30
par Invité
Bonjour,

Pour des traitements long, le plus simple serait de déposer le fichier dans un répertoire et de le traiter à part. Tu crées une tache périodique qui vérifie la présence de fichiers et tu les traites via un appel à PHP mais en mode ligne de commande.
Merci pour ta réponse.

Pourrais-tu préciser un peu le "en mode ligne de commande" ? S'agit-il de la commande 'exec' ?
Aurais-tu un exemple pour m'aiguiller, je suis un peu dans le brouillard...

Re: Importer un fichier CSV dans une base MySQL

Posté : 11 févr. 2011, 09:48
par Mazarini
Bonjour,

Sous windows, il est possible de faire la commande php.exe toto.php. Ca permet de faire exécuter toto.php sans passer par un navigateur. A priori, ca doit être la même chose sous Linux
Tu places cette commande dans un gestionnaire de tache pour le lancer régulièrement.

1) Une page pour uploader le fichier dans le répertoire
2) Un script qui regarde si un fichier est à traiter et contrôle le contenu. Si tout est ok il déplace le fichier dans un second répertoire sinon dans un troisième avec un mail d'avertissement.
3) Un script qui regarde si un fichier OK est disponible et le traite. Après le traitement, le fichier est archiver dans un quatrième répertoire. Un mail informe de la fin du traitement.

Le découpage en 2 traitement permet d'éviter des problèmes de chargement partiel dans la base après un plantage. Tu pourras faire évoluer le script de contrôle en fonction des plantages du script de traitement (on oublie toujours des trucs). L'intérêt de sauvegarder les fichiers est de permettre un contrôle de ce qui s'est passer, mais il ne faudra pas oublier un système de purge.

Re: Importer un fichier CSV dans une base MySQL

Posté : 11 févr. 2011, 21:43
par Bruno21
Bonsoir,

Merci beaucoup pour les explications.
Depuis le shell, php vient d'avaler les 200000 lignes de mon .csv sans broncher.
MacBook:~ calvin$ php -f /Library/WebServer/Documents/import.php

Il me reste plus qu'à mettre en place les differents scripts pour déplacer le fichier.