Aller au contenu

insert ou load data pour remplir une table


Sujets conseillés

Posté

Bonjour,

j'ai une table "zoneville" constitué de 4 champs

id int autoincrement

codepost varchar 6

ville varchar 30

zone varchar 2

j'ai un fichier excel au format csv (separateur en ; )

constitue d'une serie de ligne comme ceci

59230;nivelles;1
59226;lecelles;1
59230;st amand les eaux;1
59178;milonfosse;1
59178;bousignies;1

j'aimerais pouvoir remplir la table sans devoir me palucher tout çà ;)

dans le phpmyadmin

j'ai essaye

des requetes du genre

LOAD DATA INFILE '/home/users/a/xxxxx/xxx/xxx/xxxxxx.csv' INTO TABLE zonebois FIELDS TERMINATED BY ';'LINES TERMINATED BY '\n';"

j'ai toujours des messages d'erreur du style "acces denied etc..."

j'ai essaye aussi a l'aide d'un fichier php en ligne dont le code est:

<?php

$localhost="xxxxx";
$login="xxxx";
$pass="xxxxx";
$base="xxxxx";
$table="xxxxx";
mysql_connect($localhost, $login, $pass);

           mysql_select_db($base);




$req=mysql_query("LOAD DATA INFILE '/home/users/a/assoacier/www/fhl/villebois1.csv' INTO TABLE zonebois FIELDS TERMINATED BY ';'LINES TERMINATED BY '\n';");

?>

j'ai tendance à toujours vite capituler....mais là ça me gonfle...

si une bonne ames passe par ici ;)

Posté

Salut Luc,

Le "LOAD DATA INFILE" est en général interdit sur les serveurs mutualisés, question de sécurité.

Le mieux est de modifier ce fichier pour le transformer en export au format sql.

Sinon, il faut s'arranger avec le propriétaire d'un serveur dédié ;) pour qu'il fasse le LOAD suivi d'un export qui te dépannera.

Quelle version de mysql tournes-tu sur ton hébergement ?

Posté

Salut,

Ton problème vient peut-etre des droits d'accès au fichier.

Sinon tu peux essayer aussi de te faire un petit programme qui ouvre le fichier, le lit ligne par ligne et qui insère les données...

Posté

Pour ne pas te palucher les requêtes à la main tu peux faire un truc genre :

cat fichier.csv  | sed "s/^/insert into zoneville values\(\"/g" | sed "s/;/\",\"/g" |  sed "s/$/\"\);/g"

Ce qui pour ton exemple de données donne ça :

insert into zoneville values("59230","nivelles","1");
insert into zoneville values("59226","lecelles","1");
insert into zoneville values("59230","st amand les eaux","1");
insert into zoneville values("59178","milonfosse","1");
insert into zoneville values("59178","bousignies","1");

Posté

salut,

-> si celà peut te repondre concernant la version mysql

http://www.dynamisme.fr/phpinfo.php

par contre, pour que je file un load a faire faire à une bonne ames ;) celà ne me derange pas mais comme je compte en ajouter d'autres par paquets un peu plutard, ça m'embeterai de devoir a chaque fois solliciter de l'aide..

vais peut etre me diriger vers la deuxieme soluce ...

mais le "cat " ci dessus... pour moi c'est du charabia...

est ce que les requetes du style

insert into zoneville values("59178","bousignies","1");

sont valide?

si l'on considere que dans ma ligne le premier champs de ma table "ID" n'est pas renseigné car il est supposé s'autoincrementer...

Posté

C'est vrai que la deuxième solution a l'avantage de pouvoir être répétée sans problème.

Mais si ton premier champs est en auto-incrément, il faut plutôt des lignes comme:

insert into zoneville values("","59178","bousignies","1");

Posté

Et un petit commentaire sur le design de ta table:

Tu devrais utiliser des "char" plutôt que des "varchar", principalement pour les champs codepost et zone.

Ce sera plus efficace en matière de stockage et d'accès.

Et attention aux codes postaux, 6 caractères suffisent pour les codes postaux de Belgique, mais si ta table contient des données d'autres pays, cela pourrait ne pas suffire ;)

Posté

Désolé, j'avais pas fait gaffe que tu avais un champ id.

Si tu n'est pas famillier avec Unix, tu peux faire la même chose avec un "remplacé" dans notepad. Par contre je ne sais pas trop s'il y a un équivalent aux ^ et $ des expressions régulières. S'il n'y a pas d'équivalent tu peux toujours installer cygwin et taper la commande dans cygwin :

cat fichier.csv  | sed "s/^/insert into zoneville values(\"\",\"/g" | sed "s/;/\",\"/g" |  sed "s/$/\");/g"

J'ai viré les \ avant les parenthèses qui ne servaient à rien et ajouté ce qu'il faut pour ton auto-incrément.

En fait cat affiche le contenu du fichier, le signe | renvoi le résultat sur le premier sed qui ajoute en début de ligne :

insert into zoneville values("","

ensuite est appliqué le 2eme sed qui remplace les ; par :

","

et le dernier sed ajoute en fin de ligne :

");

Posté

je ne connaisaissais pas le cat...

mais tres bien le "remplacer" dans ultraedit...

ça ne m'a donc pas posé de probleme..

par contre,

ça ne m'a pas apri...grand chose en php mysql..

juste la syntaxe de "insert"

tant pis ce sera pour plutard..

le fopen...etc...

Mais en tout cas çà a marché !

encore merci

Veuillez vous connecter pour commenter

Vous pourrez laisser un commentaire après vous êtes connecté.



Connectez-vous maintenant
×
×
  • Créer...