Vous n'êtes pas identifié(e).
- Contributions : Récentes | Sans réponse
Pages : 1
#1 03/02/2012 17:23:11
- map
- Membre
COPY From : format delimiteur
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
#2 03/02/2012 19:22:20
- Marc Cousin
- Membre
Re : COPY From : format delimiteur
Vous avez quel message d'erreur exactement ?
Marc.
Hors ligne
#3 03/02/2012 19:48:04
- dverite
- Membre
Re : COPY From : format delimiteur
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
#4 04/02/2012 09:39:19
- Marc Cousin
- Membre
Re : COPY From : format delimiteur
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
#5 06/02/2012 13:09:57
- map
- Membre
Re : COPY From : format delimiteur
@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
#6 06/02/2012 19:53:14
- cedric
- Membre
Re : COPY From : format delimiteur
@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
#7 07/02/2012 10:20:18
- Marc Cousin
- Membre
Re : COPY From : format delimiteur
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