Vous n'êtes pas identifié(e).

#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).

Hors ligne

Pied de page des forums