Précédent   Forum des professionnels en informatique > Bases de données > MySQL > Requêtes
Requêtes Forum d'entraide sur les requêtes MySQL
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 09/03/2011, 11h03   #1
Invité de passage
 
Inscription : octobre 2006
Messages : 31
Détails du profil
Informations forums :
Inscription : octobre 2006
Messages : 31
Points : 3
Points : 3
Par défaut Problème LOAD DATA IN FILE

Bonjour à tous,

J'ai un problème avec une requête LOAD DATA IN FILE que je n'arrive pas à écrire.

Voici le format de mon fichier csv :

Citation:
NOM;PRENOM;SEXE;NAISSANCE;CP;VILLE
nom1;prenom1;h;1984-09-03;13100;AIX
nom2;prenom2;f;1989-12-06;13100;AIX
nom3;prenom3;f;1979-08-29;13800;ISTRES
Ma table PERSONNE contient les champs :
id, nom, prenom, naissance, ville

Pour le début de ma requête la syntaxe est je pense :
Code :
1
2
3
4
5
6
7
8
9
10
11
 
LOAD DATA INFILE ‘fichier.csv’
        INTO TABLE PERSONNE
FIELDS
        TERMINATED BY ';'
        ENCLOSED BY ''
LINES
        STARTING BY ''
        TERMINATED BY '\n'
IGNORE 1 LINES
(nom, prenom, naissance, ville)
Donc les colonnes SEXE et CP de mon csv ne me servent pas dans ma base.
Comment dire à ma requête de ne pas les prendre en compte ?

Je ne trouve pas la syntaxe qui me permet de dire tels colonne du csv correspond à tel champs de ma table.

Merci d'avance si vous arrivez à m'aider
LostRailler est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/03/2011, 14h00   #2
Membre Expert
 
Inscription : août 2002
Messages : 1 036
Détails du profil
Informations forums :
Inscription : août 2002
Messages : 1 036
Points : 1 166
Points : 1 166
Bonjour,

Extrait du manuel mysql :
Citation:
Si vous voulez charger uniquement quelques colonnes dans une table, spécifiez la liste des champs :

mysql> LOAD DATA INFILE 'persondata.txt'
-> INTO TABLE persondata (col1,col2,...);

Vous devez aussi spécifier les champs si l'ordre dans lequel ils seront lus diffère de l'ordre des colonnes dans la table. Sinon, MySQL ne pourra pas savoir à quelle colonne correspond une valeur.
Ici : http://dev.mysql.com/doc/refman/5.0/fr/load-data.html
jeca est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/03/2011, 14h16   #3
Invité de passage
 
Inscription : octobre 2006
Messages : 31
Détails du profil
Informations forums :
Inscription : octobre 2006
Messages : 31
Points : 3
Points : 3
Merci pour ta réponse mais ce que tu me dis je l'avais lu et je le met dans mon exemple (les champs de ma table sont spécifiés à la fin de ma requête).

Citation:
Vous devez aussi spécifier les champs si l'ordre dans lequel ils seront lus diffère de l'ordre des colonnes dans la table
En fait ce que je veux savoir c'est comment je les indique les champs du fichier csv ? Comment je lui dit que le champs ville de ma table correspond au champs VILLE de mon csv ?
LostRailler est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/03/2011, 16h13   #4
Membre Expert
 
Avatar de Nudger
 
Homme Thomas Arnaud
Directeur de projet
Inscription : octobre 2010
Messages : 452
Détails du profil
Informations personnelles :
Nom : Homme Thomas Arnaud
Âge : 36
Localisation : France, Paris (Île de France)

Informations professionnelles :
Activité : Directeur de projet
Secteur : High Tech - Produits et services télécom et Internet

Informations forums :
Inscription : octobre 2010
Messages : 452
Points : 1 012
Points : 1 012
Envoyer un message via Skype™ à Nudger
Bonjour,

Ce que fait MySQL, la doc en parle.
Si la doc n'en parle pas, MySQL ne le fait probablement pas.
__________________
www.nudge.org Surveillez et optimisez vos applications Java
Nudger est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/03/2011, 09h53   #5
Invité de passage
 
Inscription : octobre 2006
Messages : 31
Détails du profil
Informations forums :
Inscription : octobre 2006
Messages : 31
Points : 3
Points : 3
Bonjour,

ok, au cas ou il y avait un moyen de contourner ce problème
Tant pis, je vais faire l'import en parsant ligne par ligne le csv en php.

Merci de vos réponses
LostRailler est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/03/2011, 09h54   #6
Modérateur
 
Avatar de CinePhil
 
Homme Philippe Leménager
Ingénieur d'études en informatique
Inscription : août 2006
Messages : 10 993
Détails du profil
Informations personnelles :
Nom : Homme Philippe Leménager
Âge : 48
Localisation : France, Haute Garonne (Midi Pyrénées)

Informations professionnelles :
Activité : Ingénieur d'études en informatique
Secteur : Enseignement

Informations forums :
Inscription : août 2006
Messages : 10 993
Points : 18 250
Points : 18 250
Envoyer un message via MSN à CinePhil
Pour compléter ce que dit Nudger :
Citation:
Envoyé par Documentation MySQL
Si une ligne d'entrée comporte trop de colonnes, les champs en trop sont ignorés, et le nombre d'alertes est incrémenté.
Dans ton cas, tu veux ignorer une colonne du fichier source et MySQL ne sait pas le faire.

La solution : transférer toutes les données dans une table temporaire et ensuite requêter cette table pour alimenter la vraie table.
__________________
Philippe Leménager. Ingénieur d'étude à l'École Nationale de Formation Agronomique.
Mon blog sur la conception des BDD, le langage SQL, le PHP avec Zend Framework...
« Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
À la maison comme au bureau, j'utilise Mandriva Linux ou Mageïa ! Soutenons l'industrie logicielle française !
Linuxiens, comptez-vous !
CinePhil est actuellement connecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/03/2011, 10h43   #7
Invité de passage
 
Inscription : octobre 2006
Messages : 31
Détails du profil
Informations forums :
Inscription : octobre 2006
Messages : 31
Points : 3
Points : 3
Yes mais en fait le problème est plus complexe que ça dans mon cas.
J'ai pris un exemple simple pour pas rentrer dans des explications longues.

En fait mon fichier csv comprend une trentaine de colonnes et ma table aussi.
Certaine colonne du csv n'apparaissent pas dans ma table et vis-versa.
Et j'ai environ 150 000 lignes.

Alimenter une table temporaire et transférer dans ma table définitive me prend autant de temps que de parser le csv en php et faire des INSERT.

Autre solution mais je ne la teste pas car elle me semble encore plus longue qui consiste à reconstruire mon csv automatiquement. Mais celui-ci est amené à évoluer régulièrement...

En tout cas encore merci pour votre réactivité
LostRailler est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/03/2011, 11h09   #8
Modérateur
 
Avatar de CinePhil
 
Homme Philippe Leménager
Ingénieur d'études en informatique
Inscription : août 2006
Messages : 10 993
Détails du profil
Informations personnelles :
Nom : Homme Philippe Leménager
Âge : 48
Localisation : France, Haute Garonne (Midi Pyrénées)

Informations professionnelles :
Activité : Ingénieur d'études en informatique
Secteur : Enseignement

Informations forums :
Inscription : août 2006
Messages : 10 993
Points : 18 250
Points : 18 250
Envoyer un message via MSN à CinePhil
Importer 150 000 lignes CSV doit prendre moins d'une minute.

Une fois la requête créée, alimenter la vraie table à partir des 150 000 lignes de la table temporaire ne devrait pas prendre plus d'une seconde.

Parser le fichier CSV en PHP et faire 150 000 requêtes INSERT à partir du PHP doit prendre à mon avis beaucoup plus longtemps !
Je me souviens avoir été obligé de faire ce genre de truc pour scinder une colonne multi-données et j'avais dû lancer le programme en deux fois en repérant à quelle ligne de la table il s'était interrompu par max_execution_time.
En plus, la requête SQL est plus sûre que le programme PHP.

Et si le fichier est à importer plusieurs fois mais que sa structure ne change pas, il suffit d'enregistrer la requête dans un fichier texte ou de faire un programme PHP qui lance d'abord la requête LOAD DATA INFILE puis la requête d'alimentation de la vraie table.
__________________
Philippe Leménager. Ingénieur d'étude à l'École Nationale de Formation Agronomique.
Mon blog sur la conception des BDD, le langage SQL, le PHP avec Zend Framework...
« Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
À la maison comme au bureau, j'utilise Mandriva Linux ou Mageïa ! Soutenons l'industrie logicielle française !
Linuxiens, comptez-vous !
CinePhil est actuellement connecté   Envoyer un message privé Réponse avec citation 00
Vieux 29/09/2011, 10h44   #9
Nouveau Membre du Club
 
Inscription : septembre 2008
Messages : 178
Détails du profil
Informations forums :
Inscription : septembre 2008
Messages : 178
Points : 25
Points : 25
Essaye ceci:

Code :
1
2
3
4
5
6
7
8
9
10
LOAD DATA INFILE 'fichier.csv'
        INTO TABLE PERSONE
FIELDS
        TERMINATED BY ';'
        ENCLOSED BY ''
LINES
        STARTING BY ''
        TERMINATED BY '\n'
IGNORE 1 LINES
(nom, prenom, @sexe, naissance, @cp, ville)
dxerty est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 18h05.


 
 
 
 
Partenaires

Hébergement Web