2012-04-17 326 views
16

例CSV行:PostgreSQL的COPY和CSV數據瓦特/雙引號

"2012","Test User","ABC","First","71.0","","","0","0","3","3","0","0","","0","","","","","0.1","","4.0","0.1","4.2","80.8","847" 

所有值之後 「第一」 是數字列。剛剛引用的很多NULL值是正確的。

在嘗試COPY:

copy mytable from 'myfile.csv' with csv header quote '"'; 

NOPE:ERROR: invalid input syntax for type numeric: ""

嗯,是的。這是一個空值。在COPY嘗試2:

copy mytable from 'myfile.csv' with csv header quote '"' null '""'; 

NOPE:ERROR: CSV quote character must not appear in the NULL specification

什麼是小夥子呢?在運行COPY之前,從文件中去除所有雙引號?可以做到這一點,但我認爲有一個適當的解決方案必須是一個非常普遍的問題。

+0

貌似PostgreSQL中給我的錯誤(這是仍然存在在9.4),因爲'空「」'應該把空字符串爲空。 – Tobia 2016-03-14 10:57:29

回答

8

雖然有些數據庫產品將空字符串視爲NULL值,但標準表示它們是不同的,PostgreSQL將它們視爲不同的。

如果您可以生成具有明確表示形式的CSV文件,這將是最好的。雖然你可能使用sed或其他東西過濾文件到良好的格式,另一種選擇是COPY數據到一個表中,其中text列可以接受空字符串,然後填充目標表。 NULLIF函數可能對此有所幫助:http://www.postgresql.org/docs/9.1/interactive/functions-conditional.html#FUNCTIONS-NULLIF - 如果兩個參數匹配,它將返回NULL,如果兩個參數匹配則返回第一個值,否則返回第一個值。所以,像NULLIF(txtcol, '')::numeric這樣的東西可能適合你。

+0

酷 - 我可以很容易地創建沒有雙引號的CSV,但是男人,我不確定有什麼比空的雙引號字符串含糊不清。雖然這只是我。 – Wells 2012-04-17 18:00:49

+2

@Wells:根據SQL規範,你可以有一個長度爲零的字符串,這與'NULL'不是一回事。我知道有些數據庫會將它們視爲同一事物的不同拼寫,並且如果您只使用了可能看起來很自然的產品,但從邏輯上講,知道該值是長度爲零的字符串並且不知道價值。 – kgrittn 2012-04-17 18:03:55

+0

同意,但該列是數據庫中的數字,所以我不確定爲什麼COPY應該擔心將CSV值視爲字符串。 – Wells 2012-04-17 18:13:31

7

作爲替代,使用

sed 's/""//g' myfile.csv > myfile-formatted.csv 
psql 
# copy mytable from 'myfile-formatted.csv' with csv header; 

工程,以及。

+2

非常好的想法,但我認爲'',/'N/g''會更合適。 (\ N是NULL的表示) – wildplasser 2012-09-05 18:32:05

+0

'帶有csv'暗示'null''(空字符串=空) – wrschneider 2016-02-18 17:54:52

1

我認爲,所有你需要做的,是以下幾點:

COPY mytable from '/dir/myfile.csv' DELIMITER ',' NULL '' WITH CSV HEADER QUOTE ; 
+0

我認爲在代碼塊中看起來會更好 – demongolem 2013-01-11 15:41:59

+1

可悲的是。在PSQL 9.3上,'QUOTE'出現語法錯誤,'NULL'''不會將空字符串轉換爲NULL。 – 2015-07-01 23:04:24

1
COPY mytable from '/dir/myfile.csv' DELIMITER ',' NULL '' 
WITH CSV HEADER FORCE QUOTE *;