8797 sujets

Développement web côté serveur, CMS

Bonjour à tous,
Doucement, je progresse ; après avoir rechargé Wamp, j'ai créé ma base et la première table.
A la main, j'arrive à charger les lignes… mais compte tenu du nombre, je suis obligé de les " importer" dans la table.
Pour cela, je transforme mon fichier Excel en fichier csv. en ayant bien veillé à ce que mes têtes de colonnes soient identiques entre la base et excel !
Mais, j'ai ma clé primaire en dernière colonne (la 15) et ça me pose problème (?) :
MySQL ne veut en aucun cas reconnaître le dernière colonne m'envoyant le message :
Colonne 14 invalide! Assurez-vous que les noms de colonnes sont orthographiés correctement, séparés par des virgules et non entourés de guillemets.
Il cible là la colonne 14 car j'ai fait de multiples essais :
• avec 15 colonnes pour avoir mon séparateur ";" derrière la colonne 15
• avec 14 colonnes déclarées : le cas du message,
• en sautant une ligne (ou pas) en début de table (les libellés),
• en induisant (ou non) une valeur de clé de 1 à nnn,
• en codant les caractères en ANSI ou UTF-8,
• nom des colonnes encadrées de virgules ou points-virgules,…
Je suis au bout de mon imagination.
Je joins les 2 premières lignes de la table (avec virgules ou points virgules des libellés) compte tenu du message erreur !
Merci de vos observations et/ou idées pour recadrer ce chargement incontournable.
Bonne soirée, et @bientôt RJL2618

cart,anais,civil,nomadh,prenom,ad1,ad2,CPost,ville,TFixe,Tmob,Admail,Anadh,Fonc,cle,
1;1940;M.;VIDANT;André;79 bd du Littoral;;22810;STxxx;02 99 99 85 77;06 99 99 20 68;andre.vidant@gmail.com;2011;VP;;

cart;anais;civil;nomadh;prenom;ad1;ad2;CPost;ville;TFixe;Tmob;Admail;Anadh;Fonc;cle;
1;1940;M.;VIDANT;André;79 bd du Littoral;;22810;STxxx;02 99 99 85 77;06 99 99 20 68;andre.vidant@gmail.com;2011;VP;;

Modifié par rjl (18 Jun 2012 - 22:49)
Bonjour,

Si tu utilises fgetscv() sans spécifier ses paramètres facultatifs, alors c'est par défaut la virgule qui doit servir de séparateur de champs et les données sont encapsulées dans des guillemets.

Note que ta première ligne n'est pas absolument nécessaire ; d'ailleurs, généralement, en ne veut pas l'inclure vu qu'elle ne contient pas de données mais seulement les noms des colonnes... Je vois donc 2 solutions (je réduis le nombre de champs à 3 pour l'exemple) :

1) Tu gardes ta première ligne dans ton CSV :

"champ1","champ2","champ3"
"valeur1_1","valeur1_2","valeur1_3"
"valeur2_1","valeur2_2","valeur2_3"
(etc.)

Ton script PHP prendra soin de ne pas inclure la première ligne (sauf si tu la veux vraiment...)

2) Tu enlèves la première ligne du CSV :

"valeur1_1","valeur1_2","valeur1_3"
"valeur2_1","valeur2_2","valeur2_3"
(etc.)

Ton script PHP doit alors inclure toutes les lignes.

Bref, il y a plusieurs solutions possibles, à toi de voir ce que tu veux et de bien utiliser la fonction fgetcsv, en remplissant éventuellement ses paramètres facultatifs.

A+
Modifié par Alomon (19 Jun 2012 - 02:34)
Bonjour Alomon et merci de ta longue réponse.

Premier problème pour moi, j'ai travaillé en Access et par ailleurs réalisé un autre site Web mais si j'ai accidentellement introduit quelques lignes de PHP (transmises par un tiers ou pompées d'un script), je ne le pratique pas (pas plus que Apache ni MySQL) même si j'ai l'intention de m'y mettre : ça me handicape tant que je n'ai pu franchir le pas : je devine ce qu'est fgetscv() mais serai tout aussi gêné pour l'intégrer dans son environnement d'où ma propension à utiliser les commande directe graphique mise à disposition par PHPmyAdmin, par exemple ! Merci cependant d'avoir mis un lien pour voir cette instruction et les exemples d'utilisation associés (j'aurai tenté le coup si je n'avais trouvé dans un délai "raisonnable" ;de même en importation via PHPmyAdmin, il existe une instruction similaire "CSV LOAD DATA" que je n'ai pas non plus utilisée car proposée en pHP, je ne l'avais pas remarquée dans PHPmyAdmin et ne l'ai découverte que ce soir en travaillant ma réponse pour la seconde personne qui, avec toi, m'a apporté une réponse !

En gros, je travaille par strates : celles qui me permettent la réponse la plus rapide (à l'économie) puis le sujet réssolu, j'analyse les propositions que je n'ai pas nécessairement misees en oeuvre mais qui sont alors pour moi plus perméables et toujours enrichissantes, ce qui me fait aborder le sujet sous différents angles qui s'épaulent.

Néanmoins, à quelques détails près, je suis parvenu à mes fins après de multiples essais !
Travaillant en Excel, j'avais à ma disposition CSV : séparateur : point-virgule (*.csv) donc, pas de possibilité de mettre une virgule comme séparateur, ce qui est sans difficulté puisque l'importation dans MySQL autorise le choix du séparateur !
Inversement, j'ai maintenu la ligne 1 "noms de colonnes" en ignorant simplement son traitement (première ligne du fichier *.csv) sauf à quoi j'avais droit à une erreur sur le nombre de colonnes (si je la supprimais du fichier) ! Surtout, j'ai supprimé dans cette ligne des libellés le nom de colonne 'cle' qui correspondait à ma clé primaire en auto-incrémentation.

Parallèlement, j'ai créé une colonne avec un simple blanc dans chaque cellule en fin de ligne permettant d'obtenir un séparateur sur la dernière cellule utile (un point-virgule).
Les points sur lesquels j'ai erré :

• J'ai obtenu des caractères non imprimables (remplacés par des "?") ; je les pense liés à une différence de mode d'enregistrement ; ainsi, dans mes page HTML, j'utilise maintenant UTF-8 ; n'ayant pas fait attention initialement lors de la la création de la table, je me suis retrouvé avec un mode d'interclassement (dont je ne perçois pas la portée) basé sur "latin 1 Swedish_ci" !
• J'ai corrigé pour l'interclassement général au niveau table par utf-8 général_ci mais n'ai pu trouver la même codification au plan des champs pour lesquels j'ai utilisé "latin1_general_ci" ! Je pense que c'est sans incidence.
• Pour les caractères incorrects (j'ai fait l'import avec utf-8 sans savoir en quel jeu de caractère ils sont dans Excel), s'agissant d'une reprise unique, je les ai corrigés dans chaque champ concerné (long mais suffisant). Il était d'ailleurs curieux de voir ce qui est normal les caractères accentués mais aussi beaucoup de blancs (pas tous) entre le numéro de voie et la voie, elle-même (rue).

Voilà la manière dont j'en suis sorti et je te remercie pour ton éclairage Bonne continuation et @+ ; amicalement
RJL2619