Vous n'êtes pas identifié(e).
Pages : 1
Bonjour,
Je bloque sur un problème d'import de fichier type (*.csv) à partir de l'outil : psql.
Comment spécifier dans la ligne de commande le fait de ne pas spécifier l'usage de caractères d'encadrement, car par défaut le caractère point virgule est utilisé ? (selon la documentation).
J'ai bien noté l'existence du mot clé : QUOTE, mais celui-ci attend nécessairement un caractère.
D'avance merci de votre réponse.
Hors ligne
Désolé, j'ai indiqué dans mon post précédent une petite erreur.
Il ne s'agit pas du caractère point virgule mais du guillemet, utilisé par défaut.
Hors ligne
Le format CSV est défini (rétrospectivement) via 7 règles dans une RFC ici: https://tools.ietf.org/html/rfc4180 .
Si le fichier utilise des guillemets librement, c.a.d sans tenir compte du fait que c'est un caractère d'encadrement, il ne respecte pas les règles #5 et #7 de la spécification, donc ce n'est pas du CSV, c'est juste des champs séparés par un caractère, et on compte sur la chance ou sur une règle métier autre pour que les contenus ne comprennent ni ce caractère, ni des sauts de ligne (puisque l'encadrement via guillemets sert justement à gérer ces cas).
Pour l'importer quand même avec \copy, je pense qu'il faut spécifier un caractère de QUOTE qui n'est jamais utilisé dans le fichier. Il faut en plus qu'il fasse partie du jeu ASCII, donc un caractère de contrôle comme par exemple E'\001' ou E'\b' (code 8) pourraient faire l'affaire.
\copy nomdetable FROM stdin (format csv, quote E'\b')
@DanielVerite
http://blog-postgresql.verite.pro/
Hors ligne
Merci de ta réponse.
J'avais essayé une commande similaire à l'aide du mot clé QUOTE sans y parvenir.
J'obtenais l'erreur suivante :
FROM STDIN WITH (FORMAT csv, QUOTE '\b', HEADER, DELIMITER '|')
ERREUR: le guillemet COPY doit être sur un seul caractère sur un octet
J'ai bien réussi à charge mon fichier selon la façon indiquée.
Peux tu m'expliquer la notation E'\b' utilisée pour préciser le caractère d'encadrement ?
D'avance merci de ton retour.
Hors ligne
Le E devant une chaîne de caractères indique que l'antislash dans cette chaîne est un caractère d'échappement, sinon c'est un caractère normal (enfin sauf si standard_conforming_strings est à OFF mais en postgres moderne, il devrait être à ON).
Dans la doc c'est décrit ici: https://docs.postgresql.fr/10/sql-synta … ngs-escape
@DanielVerite
http://blog-postgresql.verite.pro/
Hors ligne
Merci beaucoup pour ces précieuses informations.
Hors ligne
Pages : 1