如何在Snowflake文件格式中处理双引号与反斜杠转义?
解决方案
你的CSV数据中存在带转义双引号的字段(例如|"\"Bremen \""|),希望通过COPY INTO导入后得到不含额外引号的Bremen (对应存储展示为|"Bremen "|),当前的文件格式配置未达到预期,可通过以下两种方式处理:
方式一:调整文件格式参数+COPY INTO字段转换
首先修改文件格式,将ESCAPE替换为ESCAPE_ENCLOSED_BY,确保正确解析字段内的转义字符:
CREATE OR REPLACE FILE FORMAT PO_PIPE type = 'CSV' TIMESTAMP_FORMAT = 'YYYY-MM-DD hh24:mi:ss.ff' skip_header = 1 field_delimiter = '|' FIELD_OPTIONALLY_ENCLOSED_BY ='"' ESCAPE_ENCLOSED_BY = '\\' -- 专门处理被双引号包裹字段内的转义字符 TRIM_SPACE = TRUE null_if = ('\\N','NULL','Null','(null)','null','','\\n') EMPTY_FIELD_AS_NULL = TRUE ERROR_ON_COLUMN_COUNT_MISMATCH=FALSE COMPRESSION=GZIP;
此时导入后字段值会是"Bremen ",若要去掉内容中的引号,在COPY INTO语句中用REPLACE函数做转换:
COPY INTO target_table (target_col) FROM ( SELECT REPLACE($1, '"', '') AS target_col FROM @your_stage/your_file.csv.gz ) FILE_FORMAT = (FORMAT_NAME = PO_PIPE);
方式二:直接通过文件格式解析(针对特殊转义逻辑)
如果原始数据中字段内的\"属于冗余内容,可尝试将双引号设为转义字符,让Snowflake直接消除字段内的引号:
CREATE OR REPLACE FILE FORMAT PO_PIPE type = 'CSV' TIMESTAMP_FORMAT = 'YYYY-MM-DD hh24:mi:ss.ff' skip_header = 1 field_delimiter = '|' FIELD_OPTIONALLY_ENCLOSED_BY ='"' ESCAPE = '"' -- 将双引号作为转义标记,消除字段内的引号 TRIM_SPACE = TRUE null_if = ('\\N','NULL','Null','(null)','null','','\\n') EMPTY_FIELD_AS_NULL = TRUE ERROR_ON_COLUMN_COUNT_MISMATCH=FALSE COMPRESSION=GZIP;
这种配置下,Snowflake会直接解析出不含引号的Bremen 。
内容的提问来源于stack exchange,提问作者Marcus
相关产品推荐
相关产品推荐

