CSV to SQL : LOAD DATA INFILE

CSV to SQL : LOAD DATA INFILE - SQL/NoSQL - Programmation

Marsh Posté le 28-04-2010 à 10:00:51    

Bonjour,
 
Je travaille actuellement sur un projet et je dois convertir des fichiers csv en base de données mysql. J'utilise pour ça la fonction LOAD DATA INFILE qui fonctionne bien. Voici ce que contient mon fichier csv exemple : 1,James,Smith,19750101
              2,Meggie,Smith,19790122
              3,Robert,Smith,20071101
              4,Alex,Smith,20040202
 
Voici ensuite mon fichier sql :  
 
USE test
 
DROP TABLE IF EXISTS CSVTest;
CREATE TABLE IF NOT EXISTS CSVTest (
id INT NOT NULL,  
nom varchar(255) NOT NULL,  
prenom varchar(255) NOT NULL,  
date datetime NOT NULL,  
PRIMARY KEY (id)
)ENGINE=MyISAM DEFAULT CHARSET=latin1;  
 
 
LOAD DATA INFILE 'C:\\csvtest.txt'
INTO TABLE csvtest
FIELDS TERMINATED BY ','
 
 
La création de la table et l'insertion se passe nickel sauf que je récolte 3 warnings à la fin :
Warning 1264 Out of range value for column 'date' at row 1
Warning 1264 Out of range value for column 'date' at row 2
Warning 1264 Out of range value for column 'date' at row 3
 
Les dates des 3 premières lignes sont à 0000-00-00 00:00:00. Pas de problème en revanche avec la ligne 4. Impossible de trouver d'où vient le problème. J'ai essayé plusieurs format de date, changer le nom du champ date pour éviter tout conflit... Dans le fichier csv j'ai même remplacé les 3 premières lignes par la 4ème et même avec ça, seul la date de la dernière ligne fonctionne...
 
Je débute en sql et je vais devoir utiliser cette fonction à plusieurs reprise par la suite donc si quelqu'un voit d'où vient le problème ça m'aiderai énormément!
 
Merci et bonne journée.
 
 
 
 
 

Reply

Marsh Posté le 28-04-2010 à 10:00:51   

Reply

Marsh Posté le 28-04-2010 à 10:30:41    

Sauf erreur, le format utilisé pour MySQL est YYYY-MM-DD, et non pas YYYYMMDD. Donc il faut faire une conversion au bon format avant de faire le chargement, pour avoir, par exemple '2007-11-01' au lieu de '20071101'.

Reply

Marsh Posté le 28-04-2010 à 11:16:18    

En general quand on charge une table a partir d'un fichier, no charge tout dans des champs varchar (pour eviter les problemes de conversion) et puis tu convertis en transferant le contenu de ta table load_xx vers xx.

Reply

Marsh Posté le 28-04-2010 à 11:29:53    

C'est bien ça! Si je change mon fichier csv tel que :
1,James,Smith,1975-01-01
2,Meggie,Smith,1979-01-22
3,Robert,Smith,2007-11-01
4,Alex,Smith,2004-02-02
 
je n'ai plus de warning. Ce que je comprend pas par contre c'est que précédemment il arrivait quand même à m'afficher la date de la 4ème ligne sans les "-"...
 
Est-on obligé de faire la conversion au préalable où est-il possible d'utiliser une requête sql pour lui indique le format de date voulue avant de charger le fichier csv, ce qui m'arrangerai plus...?

Reply

Marsh Posté le 03-05-2010 à 10:09:38    

on peut faire la conversion pendant l'import.
 
par exemple :
LOAD DATA LOCAL INFILE 'mon_fichier.txt' INTO TABLE ma_table FIELDS TERMINATED BY ';' ENCLOSED BY '' ESCAPED BY '' LINES TERMINATED BY '\n'
(ch1, ch2, ch3, @date, ch4)
SET date = date_format(str_to_date(@date, '%d/%m/%Y'), '%Y-%m-%d')

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed