2016-02-02 3 views
4

J'importe des données d'un fichier vers la table de base de données PostgreSQL en utilisant COPY FROM. Certaines des chaînes de mon fichier contiennent des caractères hexadécimaux (principalement \ x0d et \ x0a) et je voudrais qu'ils soient convertis en texte normal en utilisant COPY.
Mon problème est qu'ils sont traités comme texte normal et restent dans la chaîne inchangée.
Comment puis-je convertir les valeurs hexadécimales?Comment convertir des caractères hexadécimaux avec Postgres COPY FROM?

Voici un exemple simplifié de ma situation:

-- The table I am importing to 
CREATE TABLE my_pg_table (
    id serial NOT NULL, 
    value text 
); 

COPY my_pg_table(id, data) 
FROM 'location/data.file' 
WITH CSV 
DELIMITER ' ' -- this is actually a tab 
QUOTE '''' 
ENCODING 'UTF-8' 

fichier Exemple:

1 'some data' 
2 'some more data \x0d' 
3 'even more data \x0d\x0a' 

Remarque: le fichier est délimité par des tabulations.

Maintenant, faire:

SELECT * FROM my_pg_table 

me obtiendrait des résultats contenant hex.

Informations complémentaires pour le contexte:

Ma tâche consiste à exporter les données des tables sybase (plusieurs centaines) et l'importation à Postgres. J'utilise UNLOAD pour exporter des données vers des fichiers comme ceci:

UNLOAD 
TABLE my_sybase_table 
TO 'location/data.file' 
DELIMITED BY ' ' -- this is actually a tab 
BYTE ORDER MARK OFF 
ENCODING 'UTF-8' 

Répondre

1

Il me semble que (pour une raison que je ne comprends pas) hex est seulement converti lors de l'utilisation FORMAT TEXT et FORMAT CSV traitera comme régulière chaîne.

Résoudre le problème dans ma situation:
Parce que je devais utiliser TEXT je ne pas l'option QUOTE plus et à cause de cela je ne pouvais pas avoir cité des chaînes dans mes dossiers plus. Il me fallait donc mes fichiers dans un petit format différent et éventuellement utilisé cela pour exporter ma table de sybase:

UNLOAD 
    SELECT 
    COALESCE(cast(id as long varchar), '(NULL)'), 
    COALESCE(cast(data as long varchar), '(NULL)') 
    FROM my_sybase_table 
TO 'location/data.file' 
DELIMITED BY ' ' -- still tab delimited 
BYTE ORDER MARK OFF 
QUOTES OFF 
ENCODING 'UTF-8' 

et importer postgre:

COPY my_pg_table(id, data) 
FROM 'location/data.file' 
DELIMITER ' ' -- tab delimited 
NULL '(NULL)' 
ENCODING 'UTF-8' 

j'ai utilisé (NULL), parce que je besoin d'un moyen de différencier entre une chaîne vide et null. J'ai jeté chaque colonne à long varchar, pour rendre mon exportation/importation de masse plus commode.

Je serais toujours très intéressé de savoir pourquoi hex ne convertirait pas en utilisant FORMAT CSV.

+1

La réponse à la question dans votre dernier paragraphe: https://www.postgresql.org/docs/current/static/sql-copy.html section Formats de fichiers: "backslash n'est pas un caractère spécial dans le format CSV" – azalea