所以,我通过以下方式解决此问题的工作succeded:
我已经包括CSV文件作为一个纯文本文件的外部表
外籍家政工人表是通过创建用这个命令:
CREATE FOREIGN TABLE table_csv (
VALUE TEXT
)
SERVER csv_import_server OPTIONS(
filename './data.csv', format 'text');
所以在CSV中的所有数据不会被它们的列分开,但一切都在一个丑陋的文本列聚集在一起。
然后我插入适当柱结构的表用了这样的命令分裂在国外表中单列:
CREATE TABLE table_target (
id INTEGER PRIMARY KEY,
value1 TEXT,
value2 TEXT);
INSERT INTO table_target (id, value1, value2) SELECT
column1::INTEGER, value1, value2
FROM (SELECT
SPLIT_PART (value, ',', 1) AS id,
SPLIT_PART (value, ',', 2) AS value1,
SPLIT_PART (value, ',', 3) AS value2
FROM table_csv) AS tmp WHERE (
tmp.id ~ '^[0-9]+$' AND
tmp.value1 != '' AND
tmp.value2 != '');
经过广泛的测试,我可以输入任何恶意CSV和我能够筛选在最后一个WHERE子句的帮助下有效的行。
它虽然有点慢,但干净,没有任何外部中间csv清洁程序之间。
AFAIK,答案是否定的。文件(CSV)数据包装器需要CSV上的数据与定义一致。另外,其他FDW(请参阅https://wiki.postgresql.org/wiki/Foreign_data_wrappers#File_Wrappers)看起来与PostgreSQL提供的一样严格。 – joanolo
@joanolo:谢谢你的回复;我可以用我自己的答案描述的方式解决这个问题。干杯! – onoSendai