14

区切り文字「〜、〜」が付いたフラットファイルからPostgreSQLテーブルにデータをロードしたいと思います。以下のように試しましたが、区切り文字に制限があるようです。COPYステートメントで区切り文字に複数の文字を使用できない場合、これを行うための代替手段はありますか?

metadb=# \COPY public.CME_DATA_STAGE_TRANS FROM 'E:\Infor\Outbound_Marketing\7.2.1\EM\metadata\pgtrans.log' WITH      DELIMITER AS '~,~'
ERROR:  COPY delimiter must be a single one-byte character
\copy: ERROR:  COPY delimiter must be a single one-byte character
4

5 に答える 5

14

Verticaを使用している場合は、 E'\t' または U&'\0009' を使用できます

非印刷区切り文字 (タブなど) を示すには、文字を拡張文字列構文 (E'...') で指定します。データベースで StandardConformingStrings が有効になっている場合は、Unicode 文字列リテラル (U&'...') を使用します。たとえば、区切り文字としてタブを指定するには、E'\t' または U&'\0009' を使用します。

于 2015-08-26T09:39:34.607 に答える
3

当然のことは、他のすべての回答がアドバイスしたことです。インポートファイルを編集します。私もそうします。

ただし、概念実証として、追加のツールを使用せずにこれを実現する 2 つの方法を次に示します。

1) 一般的な解決策

CREATE OR REPLACE FUNCTION f_import_file(OUT my_count integer)
  RETURNS integer AS
$BODY$
DECLARE
    myfile    text;  -- read xml file into that var.
    datafile text := '\path\to\file.txt'; -- !pg_read_file only accepts relative path in database dir!
BEGIN

myfile := pg_read_file(datafile, 0, 100000000);  -- arbitrary 100 MB max.

INSERT INTO public.my_tbl
SELECT ('(' || regexp_split_to_table(replace(myfile, '~,~', ','), E'\n') || ')')::public.my_tbl;

-- !depending on file format, you might need additional quotes to create a valid format.

GET DIAGNOSTICS my_count = ROW_COUNT;

END;
$BODY$
  LANGUAGE plpgsql VOLATILE;

これは、かなり高度な機能を多数使用しています。実際に興味があり、説明が必要な場合は、この投稿にコメントを残してください。詳しく説明します.

2) 特別な場合

'~' が区切り文字 '~,~' にのみ存在することを保証できる場合は、この特別なケースで単純な COPY を使用できます。「~,~」の「,」を追加の列として扱うだけです。たとえば、テーブルは次のようになります。

CREATE TABLE foo (a int, b int, c int);

次に、(1 つのトランザクションで) 次のことができます。

CREATE TEMP TABLE foo_tmp ON COMMIT DROP (
 a int, tmp1 "char"
,b int, tmp2 "char"
,c int);

COPY foo_tmp FROM '\path\to\file.txt' WITH DELIMITER AS '~';

ALTER TABLE foo_tmp DROP COLUMN tmp1;
ALTER TABLE foo_tmp DROP COLUMN tmp2;

INSERT INTO foo SELECT * FROM foo_tmp;
于 2011-10-09T00:40:14.630 に答える
3

残念ながら、Postgres で複数の文字区切り文字を含むフラット ファイルをロードする方法はありません。ただし、ソース コードを自分で (そしてもちろん再コンパイル) なんらかの (素晴らしい) 方法で~,~変更する必要がある場合を除きます。

/* Only single-byte delimiter strings are supported. */
if (strlen(cstate->delim) != 1)
    ereport(ERROR,
        (errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
    errmsg("COPY delimiter must be a single one-byte character")));

必要なのは、外部ツールを使用して入力ファイルを前処理sedすることです。たとえば、GNU/Linux プラットフォームで最適なコンパニオンになる可能性があります。たとえば、次のようになります。

sed s/~,~/\\t/g inputFile
于 2011-08-10T19:02:44.057 に答える
1

postgresql ソリューションを探しているのか、一般的なソリューションを探しているのかよくわかりません。

私だったら、vim (または gvim) のコピーを開き、:%s/~,~/~/g
すべての "~,~" を "~" に置き換えるコマンドを実行します。

于 2011-08-03T17:07:55.823 に答える
0

1 文字の区切り記号を使用できます。オープンnotepadプレスを何かにctrl+h置き換え~,~ても干渉しません。お気に入り|

于 2011-08-03T17:13:03.393 に答える