Postgresql - 从双引号包装的CSV空值导入

时间:2018-02-05 07:21:34

标签: postgresql csv

所以我尝试使用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语句的错误。如果我编辑文本文件并删除双引号,则导入工作正常。

我认为由于双引号和空值的CSV很常见,所以我必须在这里找到一个我缺少的工作。我当然不想去编辑我的每个CSV,因此它没有双引号!

2 个答案:

答案 0 :(得分:3)

您可能想尝试添加FORCE_NULL( column_name [, ...] )选项。

正如FORCE_NULL所述的文件:

  

匹配指定的列'对于空字符串的值,即使它已被引用,如果找到匹配,则将值设置为NULL。在空字符串为空的默认情况下,这会将带引号的空字符串转换为NULL。此选项仅在COPY FROM中允许,且仅在使用CSV格式时允许。

Postgres 9.4提供的选项:https://www.postgresql.org/docs/10/static/sql-copy.html

答案 1 :(得分:0)

如果您使用的是类似unix的平台,则可以使用sed将空字符串替换为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;