Vous n'êtes pas identifié(e).
- Contributions : Récentes | Sans réponse
Pages : 1
#1 21/12/2015 19:55:12
- Mlan2
- Membre
Import dans une table à partir de fichiers.
Bonjour,
Je cherche à importer des données dans une table à partir de fichier de type CSV.
Pour cela j'utilise le client psql en ligne de commande
Cette commande fonctionne :
psql -d test -U test -c "COPY matable FROM STDIN WITH (FORMAT csv, DELIMITER ';');" <fichier.txt
Cette commande ne fonctionne pas :
psql -d test -U test -c "COPY matable FROM STDIN WITH (FORMAT csv, DELIMITER ';', QUOTE '"');" <fichier.txt
Je voulais préciser le caractère d'encadrement des chaines de caractères en rajoutant l'option QUOTE.
La commande me parait conforme selon la syntaxe décrite dans la documentation.
COPY nom_table [ ( nom_colonne [, ...] ) ]
FROM { 'nom_fichier' | PROGRAM 'commande' | STDIN }
[ [ WITH ] ( option [, ...] ) ]
COPY { nom_table [ ( nom_colonne [, ...] ) ] | ( requête ) }
TO { 'nom_fichier' | PROGRAM 'commande' | STDOUT }
[ [ WITH ] ( option [, ...] ) ]
où option fait partie
de :
FORMAT nom_format
OIDS [ oids ]
FREEZE [ booléen ]
DELIMITER 'caractère_délimiteur'
NULL 'chaîne_null'
HEADER [ booléen ]
QUOTE 'caractère_guillemet'
ESCAPE 'caractère_échappement'
FORCE_QUOTE { ( nom_colonne [, ...] ) | * }
FORCE_NOT_NULL ( nom_colonne [, ...] )
FORCE_NULL ( nom_colonne [, ...] )
ENCODING 'nom_encodage'
Où est l'erreur ?
D'autre part, je souhaitai initialement préciser l'origine du fichier par la clause FROM { 'nom_fichier', plutôt que STDIN, mais le fichier semblait introuvable (message d'erreur).
Dans ce cas d'utilisation, où est attendu le fichier ?, côté serveur ou côté client ?
Si côté serveur, et que le chemin n'est pas précisé, je suppose qu'il y a un emplacement par défaut. Quel est t'il dans ce cas ?
D'avance merci de vos retours.
Hors ligne
#2 21/12/2015 20:23:31
- rjuju
- Administrateur
Re : Import dans une table à partir de fichiers.
psql -d test -U test -c "COPY matable FROM STDIN WITH (FORMAT csv, DELIMITER ';', QUOTE '"');" <fichier.txt
Il manque l'échappement du guillemet double. Cette requête devrait marcher:
psql -d test -U test -c "COPY matable FROM STDIN WITH (FORMAT csv, DELIMITER ';', QUOTE '\"');" <fichier.txt
D'autre part, je souhaitai initialement préciser l'origine du fichier par la clause FROM { 'nom_fichier', plutôt que STDIN, mais le fichier semblait introuvable (message d'erreur).
Dans ce cas d'utilisation, où est attendu le fichier ?, côté serveur ou côté client ?
Si côté serveur, et que le chemin n'est pas précisé, je suppose qu'il y a un emplacement par défaut. Quel est t'il dans ce cas ?
L'instruction COPY est exécutée par le serveur, du coup avec l'option FROM 'nom_fichier' ce fichier doit se trouver sur le serveur. Vous pouvez utiliser à la place la méta commande \copy de psql si vous devez le faire côté client (cf http://docs.postgresql.fr/9.4/app-psql.html ).
Côté serveur, le chemin par défaut est le répertoire de données du serveur (c'est donc une très mauvaise idée d'utiliser le chemin par défaut).
Julien.
https://rjuju.github.io/
Hors ligne
Pages : 1