显而易见的事情是所有其他答案所建议的。编辑导入文件。我也会那样做。
但是,作为概念证明,这里有两种无需额外工具即可完成此任务的方法。
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);
然后您可以(在一笔交易中):
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;