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

#1 27/06/2018 18:09:44

Mlan2
Membre

Chargement de tables à partir de psql en énumérant les colonnes;

Bonjour,

Je rencontre le problème suivant, à savoir une erreur de chargement d'un fichier de type délimité, contenant 2 champs, dont je désire charger un seul champ, en précisant les colonnes à intégrer dans la colonne COPY, ce qui ne me parait pas normal, selon la documentation.

Ci-dessous, la table à charger :

CREATE TABLE CR_LSTZTGE
(
 MATRI                    VARCHAR  (10),
 PACPAIE                  VARCHAR  (10)
);

Ci-dessous, le fichier à charger : lstztge.txt

MATRI|PACPAIE
00400285|
00600685|806294
01100376|806294
01101799|806294
01600404|806294
12345678|806294
01657826|806294
02600265|806294
03100375|806294

Ci-dessous, la commande psql exécutée, dans laquelle j'ai précisé la seule colonne que je souhaite charger :

psql -h ${PGSERVEUR} -d ${PGDB} -U ${PGUSR} -p ${PGPORT} -q -t -c "COPY CR_LSTZTGE (MATRI) FROM STDIN WITH (FORMAT csv, HEADER, DELIMITER '|');" <lstztge.txt 1> lstztge.bad 2>&1

J'obtiens le message d'erreur ci-dessous dans le fichier de rejet : lstztge.bad

ERREUR:  données supplémentaires après la dernière colonne attendue
CONTEXTE : COPY cr_lstztge, ligne 2 : « 00400285| »

La table n'est donc pas chargée

Il semble que lorsque l'on précise une seule colonne à charger, on ait cette erreur, qui est une anomalie à mon sens.

Si je ne précise pas de colonne particulière à charger, la table se charge correctement.

J'ai renouvelé le test en ajoutant un 3ème champ à la table, et en déclarant un seul champ (Le 1er) à charger (MATRI), la table ne s'est pas chargée (message d'erreur identique).

Un nouvel essai en déclarant les 2 1ers champs à charger (MATRI, PACPAIE), la table s'est chargée correctement.


Pouvez-vous éclairer ma lanterne sur ce problème ?

D'avance merci.

Cordialement.

Hors ligne

#2 27/06/2018 21:53:37

gleu
Administrateur

Re : Chargement de tables à partir de psql en énumérant les colonnes;

J'ai déplacé ce thread dans vers le forum Général, vu que ça n'a rien à voir avec le forum "Association PostgreSQL.Fr" où il avait été créé.


Guillaume.

Hors ligne

#3 27/06/2018 22:01:52

gleu
Administrateur

Re : Chargement de tables à partir de psql en énumérant les colonnes;

Concernant votre question initiale, le fichier ne doit contenir que les données souhaitées. En l'occurence, il devrait n'avoir que la première colonne, MATRI.


Guillaume.

Hors ligne

#4 28/06/2018 09:57:36

Mlan2
Membre

Re : Chargement de tables à partir de psql en énumérant les colonnes;

Merci de l'information.

La documentation fournie n'indique pas cette précision.

Hors ligne

#5 28/06/2018 10:13:43

gleu
Administrateur

Re : Chargement de tables à partir de psql en énumérant les colonnes;

Non, en effet. J'ai eu beau cherché hier, d'abord dans la traduction française, puis dans la VO (en supposant que j'avais loupé un paragraphe à traduire smile ), je n'ai rien trouvé.

Ceci étant dit, c'est logique. PostgreSQL n'a aucun moyen de savoir à quel colonne dans le CSV correspond MATRI dans la table.


Guillaume.

Hors ligne

#6 28/06/2018 12:23:11

Mlan2
Membre

Re : Chargement de tables à partir de psql en énumérant les colonnes;

Je suis, quand même étonné que, dans la mesure où une entête des noms de colonnes est fournie, PostgreSQL ne sache pas identifier les colonnes.

Il semble que PostgreSQL ne tienne pas compte du nom des colonnes indiquées. J'ai l'impression que le mot clé HEADER a pour effet d'ignorer simplement la 1ère ligne du fichier (entête).

Hors ligne

#7 28/06/2018 12:49:06

rjuju
Administrateur

Re : Chargement de tables à partir de psql en énumérant les colonnes;

C'est exactement le but de l'option HEADER.  L'intérêt de COPY est de fournir un moyen très efficace de charger un grand nombre de ligne, pas de fournir un ETL minimaliste.  La détection automatique des colonnes etc ne ferait que rendre la commande moins efficace.

Hors ligne

Pied de page des forums