8768 sujets

Développement web côté serveur, CMS

Bonjour,

Je m'essaye à la création de tables en base de données et à l'interaction avec celles-ci. Je n'arrive pas à utiliser correctement la fonction LOAD DATA LOCAL INFILE : la maj de la table échoue silencieusement, comme si le fichier était chargé sans trouver de données à l'intérieur. Enfin ça c'est mon diagnostic : le chemin du fichier semble correct car dans le cas contraire MySQL me renvoie une erreur.

Voici mon code d'insertion :
-- insertion de données via .csv
LOAD DATA LOCAL INFILE '/Users/LeCheminEstOk/Documents/Archives/web/pdo/persons.csv'
INTO TABLE _persons
FIELDS
	TERMINATED BY ';'
--	ENCLOSED BY '"'
--      commenté car pas de valeurs entourées dans le .csv
	ESCAPED BY '\\'
LINES
	STARTING BY ''
	TERMINATED BY '\n'
        -- '\r\n' selon configuration système, là je suis sur OSX
IGNORE 1 LINES
-- ignorer la première ligne
(gender,first_name,last_name,birth_date,birth_place,email,phone);
-- dénomination des colonnes


Je ne crois pas avoir oublié quoi que ce soit... voici une partie du fichier de test (persons.csv) à insérer dans la table :
gender,first_name,last_name,birth_date,birth_place,email,phone
0;Victor;Hugo;1100-01-01 00:00:00;Besançon;victor-hugo@gmail.com;0655667722
0;Charles;Trenet;1100-01-01 00:00:00;Narbonne;charles-trenet@hotmail.fr;0944331177
0;Benoît;De;Sainte-Maure;1100-01-01 00:00:00;France;ste-maure@gmail.com;0744668833
0;André;Birabeau;1890–01-01 00:00:00;France;andre-birabeau@gmail.com;0477335566

Pour ce dernier fichier je prends bien la précaution de laisser une ligne vide à la fin, afin que l'avant dernière soie prise en compte...

Qu'ai-je oublié ?
Modifié par Olivier C (11 Feb 2015 - 18:05)
Bonjour,

Il me semble qu'il y est une erreur dans ton csv,

0;Benoît;De;Sainte-Maure;1100-01-01 00:00:00;France;ste-maure@gmail.com;0744668833


Je lis 8 champs sur cette ligne, hors il me semble que tu devrais en avoir 7 ?.
Merci pour la réponse. Il y avait effectivement une erreur. Cependant, malgré la correction du fichier, le problème persiste.

Bien sûr, il me reste le SQL pour insérer les données, mais le .csv se révèle tellement pratique dans certains cas...
Je pense que la pratique du LOAD DATA INFILE pour insérer des données est bonne.
(j'insère des millions de lignes d'une traite avec cette méthode)

Pouvez-vous nous indiquer comment est structuré votre table ?
Si je me trompe pas, Les champs de la table doivent être identiques aux champs du CSV, ou bien il faut spécifier les champs nécéssaires.
Voici la structure de la table (qui a évoluée) :
-- table _persons
CREATE TABLE IF NOT EXISTS _persons (
	id BIGINT UNSIGNED NOT NULL AUTO_INCREMENT,
	user_id BIGINT UNSIGNED NULL, -- référence à _users, facultatif
	gender TINYINT(1) UNSIGNED NULL, -- homme: 0, femme: 1, personne morale: 2
	first_name VARCHAR(32) NULL, -- prénom
	middle_name VARCHAR(32) NULL, -- deuxième prénom
	last_name VARCHAR(32) NULL, -- nom de famille
	honorific_prefix VARCHAR(5) NULL, -- titres et civilité
	honorific_suffix VARCHAR(10) NULL, -- abréviation typographique après le nom (s.j., o.p.)
	birth_date DATETIME NULL, -- date de naissance
	birth_place VARCHAR(128) NULL, -- lieu de naissance
	death_date DATETIME NULL, -- date du décès
	death_place DATETIME NULL, -- lieu du décès
	nationality VARCHAR(32) NULL, -- nationnalité
	place_id BIGINT UNSIGNED NULL, -- lieu ou addresse
	phone VARCHAR(32) NULL, -- numéro de téléphone
	phone2 VARCHAR(32) NULL, -- numéro de téléphone alternatif
	email VARCHAR(128) NULL, -- peut être différent du email de table _users
	fax VARCHAR(32) NULL, -- numéro de fax
	url VARCHAR(255) NULL, -- url du site de l'utilisateur
	occupation VARCHAR(30) NULL, -- métier, profession
	bias VARCHAR(30) NULL, -- tendance, inclinaison, alignement
	hobby VARCHAR(64) NULL, -- centre d'intéret, passe-temps
	organization_id BIGINT UNSIGNED NULL, -- id de l'organisation d'appartenance
	award VARCHAR(128) NULL, -- prix, distinction
	media_id BIGINT UNSIGNED NULL, -- url de l'avatar (en plus d'un gravatar sur le mail)
	signature VARCHAR(100) NULL, -- 100 caractères max
	description TEXT NULL, -- 800 caractères max
	PRIMARY KEY (id)
) ENGINE = INNODB;

Dernier exemple en date pour le .csv :
id, user_id, gender, first_name, middle_name, last_name, honorific_prefix, honorific_suffix, birth_date, birth_place, death_date, death_place, nationality, place_id, billing_id, phone, phone2, email, fax, url, occupation, bias, hobby, organization_id, award, media_id, signature, description
24;
1;NULL;0;Francis;NULL;Ponge;Mr;NULL;1889-03-27 00:00:00;Montpellier;1988-08-06 00:00:00;Bar-sur-Loup;Française;NULL;NULL;0655442233;NULL;francisponge@gmail.com;NULL;NULL;Écrivain;NULL;NULL;NULL;Baccalauréat de droit, admissible en licence de philosophie;NULL;NULL;Francis Ponge est un poète français...

Et pour rappel mon code MySQL pour l'importation du .csv :
-- insertion de données via .csv
LOAD DATA LOCAL INFILE '/Users/MonDossier/Documents/Archives/web/pdo/persons.csv'
INTO TABLE _persons
FIELDS
	TERMINATED BY ';'
--	ENCLOSED BY '"'				commenté car pas de valeurs entourées dans le .csv
	ESCAPED BY '\\'
LINES
	STARTING BY ''
	TERMINATED BY '\n'			-- '\r\n' selon configuration système
IGNORE 1 LINES					-- ignorer la première ligne
(id, user_id, gender, first_name, middle_name, last_name, honorific_prefix, honorific_suffix, birth_date, birth_place, death_date, death_place, nationality, place_id, billing_id, phone, phone2, email, fax, url, occupation, bias, hobby, organization_id, award, media_id, signature, description);			-- dénomination des colonnes, facultatif

Modifié par Olivier C (10 Feb 2015 - 15:38)
Je pense que ton dernier CSV en date n'est pas bon, je trouve 28 résultats pour 27 colonnes.
Mince ! Exact... et merci !

Il s'agissait de la colonne `billing_id` que j'avais supprimé entre temps... Je suis partit d'une table plus simple (à trois colonnes) et je n'ai pas eu de problèmes. Merci encore.

PS : pour mémo :
-- insertion de données via .csv
LOAD DATA LOCAL INFILE '/Users/olivierchavarin/Documents/Archives/web/pdo/options.csv'
INTO TABLE _text_options
FIELDS
	TERMINATED BY ';'
	ENCLOSED BY ''
	ESCAPED BY '\\'
LINES
	STARTING BY ''
	TERMINATED BY '\n'		-- '\r\n' selon configuration système
IGNORE 0 LINES				-- ignorer X première(s) ligne(s)
-- (id, name, value);			-- dénomination des colonnes, facultatif

Le fichier .csv
2;Option à enregistrer n°1;Texte enregistré pour cette option
3;Option à enregistrer n°2;Texte enregistré pour cette option

Modifié par Olivier C (11 Feb 2015 - 18:58)