Redshift - 分隔值缺少结束引号

Bhu*_*esh 5 csv amazon-s3 amazon-web-services amazon-redshift

我正在尝试将 CSV 文件加载到 redshift。

分隔符“|”

CSV 的第一列:

1 |Bhuvi|"This is ok"|xyz@domain.com
Run Code Online (Sandbox Code Playgroud)

我用这个命令来加载。

copy tbl from 's3://datawarehouse/source.csv'   
iam_role  'arn:aws:iam:::role/xxx'cas-pulse-redshift' 
delimiter '|' 
removequotes 
ACCEPTINVCHARS ; 
Run Code Online (Sandbox Code Playgroud)

错误:

raw_field_value | This is ok" |xyz@domain.com
err_code        | 1214
err_reason      | Delimited value missing end quote
Run Code Online (Sandbox Code Playgroud)

然后我也尝试了这个。

copy tbl from 's3://datawarehouse/source.csv'   
iam_role  'arn:aws:iam:::role/xxx' 
CSV QUOTE '\"' 
DELIMITER '|'   
ACCEPTINVCHARS ; 
Run Code Online (Sandbox Code Playgroud)

Dhw*_*ade 1

免责声明 - 尽管这篇文章没有回答此处提出的问题,但我发布此分析以防它对某些人有所帮助。

如果带引号的文本列缺少结束引号,或者文本列值本身有换行,则可能会报告错误“分隔值缺少结束引号”。就我而言,文本列值中有一个换行符。

根据RFC 4180的 CSV 规范,

包含换行符 (CRLF)、双引号和逗号的字段应括在双引号中。
例如:

    "aaa","b CRLF
    bb","ccc" CRLF
    zzz,yyy,xxx
Run Code Online (Sandbox Code Playgroud)

因此,有效的 CSV 可以有多行,在 Redshift 中导入它的正确方法是指定CSV 格式选项。这还假设值中具有引号字符的所有列都将通过另一个前面的引号字符转义引号字符。这也符合 CSV RFC 规范。

如果使用双引号括住字段,则必须通过在字段前添加另一个双引号来转义出现在字段内的双引号。
例如:

   "aaa","b""bb","ccc"
Run Code Online (Sandbox Code Playgroud)

如果我们尝试导入的文件不是有效的 CSV,并且只是根据情况命名为 .CSV 文件,那么我们有以下选项。

  1. 尝试在不指定 CSV 选项的情况下复制文件,并使用相应的复制选项微调分隔符、转义和引用行为。
  2. 如果一组选项无法一致地复制数据,则预处理文件以使其一致。

一般来说,如果我们尝试以一致的格式导出和导入数据,则有助于使行为具有确定性。