2016-02-02 2 views
4

Я импортирую данные из файла в таблицу базы данных PostgreSQL, используя COPY FROM. Некоторые из строк в моем файле содержат шестнадцатеричные символы (в основном \ x0d и \ x0a), и я бы хотел, чтобы они были преобразованы в обычный текст с использованием COPY.
Моя проблема заключается в том, что они обрабатываются как обычный текст и остаются в строке неизменной.
Как можно преобразовать шестнадцатеричные значения?Как преобразовать шестнадцатеричные символы при использовании Postgres COPY FROM?

Вот упрощенный пример моей ситуации:

-- 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' 

Пример файла:

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

Примечание: файл с разделителями табуляции.

Теперь, выполнив:

SELECT * FROM my_pg_table 

бы получить меня результаты, содержащие шестигранные.

Дополнительная информация для связи:

Моя задача состоит в том, чтобы экспортировать данные из таблиц SyBase (многие сотни) и импорта в Postgres. Я использую UNLOAD экспортировать данные в файлы следующим образом:

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

ответ

1

Мне кажется, что (по причине я не понимаю) шестигранным преобразуется только при использовании FORMAT TEXT и FORMAT CSV будет относиться к ней как регулярные строка.

Решение проблемы в моей ситуации:
Потому что я должен был использовать TEXT я не имею вариант QUOTE больше, и из-за этого я не мог цитировал строки в моих файлах больше. Так что мне нужно мои файлы в немного другом формате и в конце концов использовал это, чтобы экспортировать свою таблицу из 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' 

и импортировать его в Postgres:

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

я использовал (NULL), потому что я нужен способ различать пустую строку и null. Я приложил каждую колонку к длинному varchar, чтобы сделать мой массовый экспорт/импорт более удобным.

Мне было бы очень интересно узнать, почему hex не будет конвертировать при использовании FORMAT CSV.

+1

Ответ на вопрос в вашем последнем абзаце: https://www.postgresql.org/docs/current/static/sql-copy.html раздел Форматы файлов: «обратная косая черта не является специальным символом в формате CSV» – azalea

Смежные вопросы