所以我尝试使用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,因此它没有双引号!
答案 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;