Vous n'êtes pas identifié(e).
- Contributions : Récentes | Sans réponse
#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 ), 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.
Julien.
https://rjuju.github.io/
Hors ligne