所以,我通過以下方式解決此問題的工作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