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