2017-08-03 18 views
0

因此,我將這個大的CSV文件作爲外部數據包裝表包含在我的數據庫中,我想將其內容複製到適當的表中。但是CSV部分格式不正確,並且由於數據值過多或者某些行太少而導致多次出現「額外數據」或「缺少數據」錯誤。我知道我可以在導入之前手動修改CSV文件,但我更喜歡跳過這些行的方式。有沒有辦法做到這一點?Postgresql 9.5.7:從外部數據包裝表(csv附近)插入時是否可以跳過缺少數據的行?

CREATE EXTENSION file_fdw; 
CREATE SERVER import_server FOREIGN DATA WRAPPER file_fdw; 
+1

AFAIK,答案是否定的。文件(CSV)數據包裝器需要CSV上的數據與定義一致。另外,其他FDW(請參閱https://wiki.postgresql.org/wiki/Foreign_data_wrappers#File_Wrappers)看起來與PostgreSQL提供的一樣嚴格。 – joanolo

+1

@joanolo:謝謝你的回覆;我可以用我自己的答案描述的方式解決這個問題。乾杯! – onoSendai

回答

1

所以,我通過以下方式解決此問題的工作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清潔程序之間。

相關問題