PostgreSQL La base de donnees la plus sophistiquee au monde.

Forums PostgreSQL.fr

Le forum officiel de la communauté francophone de PostgreSQL

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

#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)

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

map a écrit :

@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

Pied de page des forums