4

を使用して、ファイルから PostgreSQL データベース テーブルにデータをインポートしていますCOPY FROMファイル内の一部の文字列に 16 進文字 (ほとんどは \ x0dと \x0a) が含まれており、COPY.
私の問題は、それらが通常のテキストとして扱われ、変更されずに文字列に残ることです。
16 進値を変換するにはどうすればよいですか?

これが私の状況の簡単な例です。

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

hexを含む結果が得られます。

コンテキストの追加情報:

私の仕事は、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'
4

1 に答える 1

1

(理由がわかりませんが)16進数は使用時にのみ変換さFORMAT TEXTれ、通常のFORMAT CSV文字列として扱われるようです。

私の状況での問題の解決:
使用する必要があったためTEXTQUOTEオプションがなくなり、そのため、ファイル内の文字列を引用できなくなりました。そのため、少し異なる形式のファイルが必要になり、最終的にこれを使用して 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. 大量のエクスポート/インポートをより便利にするために、すべての列を long varchar にキャストしました。

を使用したときに hex が変換されない理由を知りたいと思っていますFORMAT CSV

于 2016-02-03T21:08:48.637 に答える