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

Postgresql-从CSV导入用双引号包装的空值,postgresql,csv,Postgresql,Csv,因此,我尝试使用COPY命令将一些数据导入postgresql 以下是数据的示例: “统一ID”、“SP\U grd1”、“SACN\U grd1”、“生物群落grd1”、“中观grd1”、“DM\U grd1”、“VEG\U grd1”、“lcov90\U alb”、“WMA\U grd1” “G01_u00000002”,“199058001.00000”,“1.00000”,“6.00000”,“24889.00000”,“2.00000”,“381.00000”,“33.00000”,“

因此,我尝试使用COPY命令将一些数据导入postgresql

以下是数据的示例:

“统一ID”、“SP\U grd1”、“SACN\U grd1”、“生物群落grd1”、“中观grd1”、“DM\U grd1”、“VEG\U grd1”、“lcov90\U alb”、“WMA\U grd1”
“G01_u00000002”,“199058001.00000”,“1.00000”,“6.00000”,“24889.00000”,“2.00000”,“381.00000”,“33.00000”,“9.00000”
“G01 0000000 8”、“******************************”、“1.00000”、“24889.00000”、“20.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 ;
CREATETABLE命令工作正常,但我在NULL AS语句中遇到了一个错误。如果编辑文本文件并删除双引号,则导入工作正常


我假设,由于带有双引号和空值的CSV非常常见,因此这里肯定有一个我遗漏的工作。我当然不想去编辑我的每个CSV,这样它就不会有双引号了

您可能希望尝试添加
FORCE_NULL(列名称[,…])
选项

FORCE_NULL
文件所述:

将指定列的值与空字符串匹配,即使该字符串已被引用,并且如果找到匹配项,请将该值设置为空。在空字符串为空的默认情况下,这会将带引号的空字符串转换为空字符串。仅在“复制自”中以及仅在使用CSV格式时才允许使用此选项


Postgres 9.4提供的选项:

您可能希望尝试添加
强制空值(列名称[,…])
选项

FORCE_NULL
文件所述:

将指定列的值与空字符串匹配,即使该字符串已被引用,并且如果找到匹配项,请将该值设置为空。在空字符串为空的默认情况下,这会将带引号的空字符串转换为空字符串。仅在“复制自”中以及仅在使用CSV格式时才允许使用此选项


Postgres 9.4提供的选项:

如果您在类unix平台上,可以使用
sed
将空字符串替换为postgresql自动识别为空的字符串。在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;

如果您在类unix平台上,可以使用
sed
将空字符串替换为postgresql自动识别为空的字符串。在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;

非常感谢。原力作用良好。但是你的技术对我的其他数据输入非常有用。谢谢。原力作用良好。但是你的技术对我的其他数据输入非常有用。