当然のことは、他のすべての回答がアドバイスしたことです。インポートファイルを編集します。私もそうします。
ただし、概念実証として、追加のツールを使用せずにこれを実現する 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;