簡體   English   中英

PostgreSQL-從CSV空值導入並用雙引號引起來

[英]Postgresql - import from CSV null values wrapped in double quotes

所以我試圖使用COPY命令將一些數據導入到postgresql中。

以下是數據的示例:

"UNIQ_ID","SP_grd1","SACN_grd1","BIOME_grd1","Meso_grd1","DM_grd1","VEG_grd1","lcov90_alb","WMA_grd1"
"G01_00000002","199058001.00000","1.00000","6.00000","24889.00000","2.00000","381.00000","33.00000","9.00000"
"G01_00000008","*********************","1.00000","*********************","24889.00000","2.00000","*********************","34.00000","*********************"

我遇到的問題是用雙引號引起來的********************* ,它們是空值。

我正在使用以下命令來創建數據表並復制數據:

CREATE TABLE bravo.G01(UNIQ_ID character varying(18), SP_grd1 double precision ,SACN_grd1 numeric,BIOME_grd1 numeric,Meso_grd1 double precision,DM_grd1 numeric,VEG_grd1 numeric,lcov90_alb numeric,WMA_grd1 numeric);

COPY bravo.g01(UNIQ_ID,SP_grd1,SACN_grd1,BIOME_grd1,Meso_grd1,DM_grd1,VEG_grd1,lcov90_alb,WMA_grd1) FROM 'F:\GreenBook-Backup\LUdatacube_20171206\CSV_Data_bravo\G01.csv' DELIMITER ',' NUll AS '*********************' CSV HEADER ;

create table命令工作正常,但我在NULL AS語句中遇到錯誤。 如果我編輯文本文件並刪除雙引號,則導入效果很好。

我以為帶有雙引號和null值的CSV很常見,因此在這里我必須缺少一些解決方法。 我當然不希望去編輯我的每個CSV,以便它沒有雙引號!

您可能想嘗試添加FORCE_NULL( column_name [, ...] )選項。

正如針對FORCE_NULL的文檔所述:

將指定列的值與空字符串進行匹配,即使已將其引號引起來,並且如果找到匹配項,請將其值設置為NULL。 在空字符串為空的默認情況下,這會將帶引號的空字符串轉換為NULL。 僅在COPY FROM中和使用CSV格式時才允許使用此選項。

可從Postgres 9.4獲得的選項: https : //www.postgresql.org/docs/10/static/sql-copy.html

如果您使用的是類似Unix的平台,則可以使用sed將NULL字符串替換為PostgreSQL將自動識別為NULL的內容。 在Windows上,powershell公開了類似的功能。

如果您需要在加載之前對數據執行其他類型的清理,則這種方法更為通用。

匹配您的空字符串的正則表達式模式為"[\\*]*"

sed清理文件:

[unix]>sed 's/"[\*]*"//g' test.csv > test2.csv

使用windows powershell清理文件:

[windows-powershell]>cat test.csv | %{$_ -replace '"[\*]*"', ""} > test2.csv

加載到postgresql中可以更短:

psql>\copy bravo.g01 FROM 'test2.csv' WITH CSV HEADER;

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM