【问题标题】:escape double quotes in snowflake在雪花中转义双引号
【发布时间】:2020-03-05 14:48:33
【问题描述】:

我正在尝试使用 copy into 命令加载数据。字段具有特殊字符作为值\",但是 FIELD_OPTIONALLY_ENCLOSED_BY 转义 \ 并在加载时出错

Found character '0' instead of field delimiter ';'

数据:

"TOL";"AANVR. 1E K ZIE RF.\";"011188"

在转义第二列值后,它考虑和转义分隔符AANVR. 1E K ZIE RF.\";,但实际上它应该是AANVR. 1E K ZIE RF.\

文件格式

 CREATE OR REPLACE FILE FORMAT TEST                  
       FIELD_DELIMITER = ';'                                                                                                                                         
       SKIP_HEADER = 1                                                                                                                                         
       TIMESTAMP_FORMAT = 'MM/DD/YYYYHH24:MI:SS'                                                                                                                                         
       escape = "\\"                                                                                                                                '
       TRIM_SPACE = TRUE                                                                                                                                         
       FIELD_OPTIONALLY_ENCLOSED_BY = '\"'                                                                                                                                         
       NULL_IF = ('')                                                                                                                                         
       ENCODING = "iso-8859-1"                                                                                                                                         
 ; 

【问题讨论】:

  • 修正escape参数上的错字是否有效?
  • 而且我认为您不需要在 FIELD_OPTIONALLY_ENCLOSED_BY 参数中使用 \。
  • @MikeWalton FIELD_OPTIONALLY_ENCLOSED_BY = '\"' 是必需的,因为其他记录的数据如 "TOL";"RPC' 'B1XQ\" ";"011189"
  • 但是您不想使用:= '"' 吗?
  • 如果您的文件中实际上没有任何转义,请设置 escape = NONE 并查看是否可以更好地处理它。

标签: snowflake-cloud-data-platform snowsql


【解决方案1】:

如果需要替换现有表中的双引号,可以在replace函数中使用'\"'语法。示例如下。

select replace(column_name,'\"','') as column_name from table_name

【讨论】:

    【解决方案2】:

    粗略的例子,但以下对我有用。如果您正在寻找不同的输出,请告诉我。

    CREATE OR REPLACE table DOUBLE_TEST_DATA (
       string1 string
     , varchar1 varchar
     , string2 string
     );                                                                                                                               
    
    COPY INTO DOUBLE_TEST_DATA FROM @TEST/doublequotesforum.csv.gz
    FILE_FORMAT = (
      TYPE=CSV
    , FIELD_DELIMITER = ';' 
    , FIELD_OPTIONALLY_ENCLOSED_BY='"'
    );
    
    select * from DOUBLE_TEST_DATA;
    

    输出:

    【讨论】:

    • 是的,这也是我的想法,但是 OP 说这些会导致所述错误。不过,它对我来说很干净。
    • @MikeWalton 提出了两个具有两个数据集 Dateset1 的场景:“WESY”;“AANVR.1E K ZIE RF.\”;“011188”; "CYDC67";"JV#19171455\\";"266020337000"; Dateset2: "SHI";"COMPLEX \"C\"";"OPT TM 16/12"; "PBMG";"BITTE WOHNUNG";"\"格洛克纳\"";使用 FIELD_OPTIONALLY_ENCLOSED_BY ='"' 和 escape= None 时数据集 1 加载正常,但 Dateset2 出现错误 Dataset2 使用 FIELD_OPTIONALLY_ENCLOSED_BY ='"' 和 escape='\\' 时加载正常,但 Dateset1 出现错误
    • @marjun 当然,我可以使用该示例运行。您希望从第二个数据集中获得什么输出?换句话说,您希望它在加载完成后是什么样子?
    • @Suzy Lockwood 输入数据集 1:"AANVR.1E K ZIE RF.\" 预期输出:AANVR。 1E K ZIE RF.\ Input Dataset2 : "\"GLOCKNER\"" Output Dataset2: "GLOCKNER" 是否可以使用 Escape=None 和 Escape='\\' 的一种文件格式加载两个数据集?
    • @marjun 不幸的是,没有,因为您告诉程序运行冲突的转义。它不会知道你想逃避哪些情况(第二个数据集)和你不想逃避哪些情况(第一个数据集)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-06-07
    • 2022-01-23
    • 2015-11-23
    • 1970-01-01
    • 2013-06-17
    • 2020-11-26
    • 1970-01-01
    相关资源
    最近更新 更多