Vous n'êtes pas identifié(e).
Pages : 1
Bonjour
Je souhaite faire un import depuis un fichier CSV généré en latin1 depuis une plateforme Unix, avec un séparateur exotique: le point d'exclamation renversé (ATL 173).
Je travaille sur win XP SP2 avec Postgre win 9.1.
Actuellement je suis "obligé" de faire une substitution avec un sed gnuwin pour remplacer ce separateur par qqchose de plus manipulable et l'import se passe bien.
Est-il possible de parametrer la commande copy pour utiliser ce separateur directement ?
Je tente:
COPY ... CSV DELIMITER E'\xAD' ENCODING 'LATIN1' HEADER ;
COPY ... CSV DELIMITER '\xAD' ENCODING 'LATIN1' HEADER ;
COPY ... CSV DELIMITER 'ALT+173' ENCODING 'LATIN1' HEADER ;
mais aucun ne marche...
merci d'avance
newbie qui n'a pas trouvé dans le forum ni la doc
Hors ligne
Vous avez quel message d'erreur exactement ?
Marc.
Hors ligne
Le code 173 n'est pas le point d'exclamation, c'est un "soft hyphen".
Voir http://en.wikipedia.org/wiki/Latin1
Le point d'exclamation inversé serait plutôt 161
Et pour le passer à COPY pourquoi ne pas commençer par le plus simple: ... DELIMITER '¡' ?
Dernière modification par dverite (03/02/2012 19:48:44)
@DanielVerite
http://blog-postgresql.verite.pro/
Hors ligne
En fait, je pense que le problème, c'est que ¿ ou n'importe quel autre caractère > 128 en latin 1, latin 9, cp 1252… fait 1 octet, dans cet encodage. Par contre, si la base est déclarée en unicode, ces caractères font 2 octets, ce qui n'est pas supporté par COPY (le COPY travaille côté serveur, le DELIMITER ne suit pas le client encoding). On ne peut pas utiliser les caractères non ascii (> 128) avec COPY en UTF8.
Marc.
Hors ligne
@dverite:
déjà tenté: une definition du caractere de separation par la manip ALT+code affiche le message d'erreur
"ERREUR: le délimiteur COPY doit être sur un seul caractère sur un octet" (et ceci pour 161 ou 173)
@Marc Cousin
dans les deux autres cas, soit pg me repond
"ERREUR: séquence d'octets invalide pour l'encodage « UTF8 » : 0xad" ou
"ERREUR: le délimiteur COPY doit être sur un seul caractère sur un octet"
si j'essaie de creuser en codant le separateur en utf8 j'obtiens soit du "sequence d'octets invalide", soit un rappel que le séparateur doit être codé sur un caractère :-(
dommage. Comme je n'ai aucun levier sur le choix du separateur, je suis donc obligé de faire le pré-traitement du csv.
merci quand meme pour votre aide.
cdt
Hors ligne
@dverite:
déjà tenté: une definition du caractere de separation par la manip ALT+code affiche le message d'erreur
"ERREUR: le délimiteur COPY doit être sur un seul caractère sur un octet" (et ceci pour 161 ou 173)@Marc Cousin
dans les deux autres cas, soit pg me repond
"ERREUR: séquence d'octets invalide pour l'encodage « UTF8 » : 0xad" ou
"ERREUR: le délimiteur COPY doit être sur un seul caractère sur un octet"si j'essaie de creuser en codant le separateur en utf8 j'obtiens soit du "sequence d'octets invalide", soit un rappel que le séparateur doit être codé sur un caractère :-(
dommage. Comme je n'ai aucun levier sur le choix du separateur, je suis donc obligé de faire le pré-traitement du csv.
merci quand meme pour votre aide.
cdt
Par défaut le lecteur de csv fournit via multicorn n'accepte pas ce caractère spécial, mais je suppose qu'il est possible de le modifier en ce sens.
http://multicorn.org/foreign-data-wrapp … ta-wrapper
Cédric Villemain +33 (0)6 20 30 22 52
http://2ndQuadrant.fr/
PostgreSQL: Support 24x7 - Développement, Expertise et Formation
Hors ligne
Oui effectivement, peut-être qu'avec multicorn. Ou avec un ETL, ou avec une regexp … ou avec un langage qui sait lire et écrire du csv (genre Text::CSV en Perl). Il y a plein de solutions, mais elles sont toutes un peu externes à Postgres, à part multicorn (qui est externe aussi mais un peu moins… mais vu que c'est du Windows, je ne sais pas trop ce que donne l'installation de multicorn, il doit y avoir de la compilation qq part …)
Marc.
Hors ligne
Pages : 1