Snowflake含分号CSV文件格式配置报错问题咨询
问题背景
有一个以分号(;)为分隔符、所有字段用双引号(")包裹的CSV文件,部分字段内部包含分号,示例如下:
...."word1";"@!!xy;abc";"word2";...
当前使用的Snowflake文件格式配置:
TYPE = csv FIELD_DELIMITER=';' SKIP_HEADER = 1 RECORD_DELIMITER = '\n' ESCAPE_UNENCLOSED_FIELD ='\\';
添加FIELD_OPTIONALLY_ENCLOSED_BY = '"'配置项后,触发报错:
Found character 'S' instead of field delimiter ';' File 'xxx.csv.gz', line 14645, character 465 Row 14644, column "yyy"["$56":56]
检查报错对应行(行14645)数据为:;"SANTA MARTA 236 SN";"BOTILLERIA DON LUIS";"SANTIAGO";,肉眼未发现明显异常。
可行解决方案
1. 排查CSV文件的隐形格式问题
肉眼看似正常的行,可能存在以下隐形问题:
- 未转义的内部引号:如果字段内存在单个未转义的
"(比如"SANTA "MARTA" 236 SN"),会导致Snowflake错误识别字段边界,把后续字符当成未包裹内容,从而找不到分隔符。 - 不可见干扰字符:用VS Code等编辑器开启「显示所有字符」功能,检查该行是否包含非打印ASCII字符、额外的换行/回车符(如
\r)。
2. 调整文件格式的转义配置
Snowflake默认用双引号本身("")作为包裹字段内引号的转义符,如果你的CSV是用反斜杠\转义引号,必须显式设置ESCAPE参数,否则会导致引号边界识别错误。修改后的配置如下:
TYPE = csv FIELD_DELIMITER=';' SKIP_HEADER = 1 RECORD_DELIMITER = '\n' FIELD_OPTIONALLY_ENCLOSED_BY = '"' ESCAPE = '\\' -- 显式指定引号转义符 ESCAPE_UNENCLOSED_FIELD ='\\';
3. 修正行分隔符配置
如果CSV文件是Windows格式(行尾为\r\n),但你设置的RECORD_DELIMITER = '\n',可能导致行拆分错误。可以尝试:
RECORD_DELIMITER = 'auto' -- 让Snowflake自动检测行分隔符
或者直接指定为'\r\n'。
4. 用小样本测试定位问题
提取报错行及前后几行生成小型测试CSV,用相同文件格式加载,看是否能复现问题。如果能复现,可精准排查该行的格式细节;如果不能,说明原文件可能存在其他行的格式问题或文件损坏。
5. 临时跳过错误行并获取详细信息
在COPY语句中添加参数,跳过列数不匹配的行,同时获取错误详情:
COPY INTO your_target_table FROM @your_stage/xxx.csv.gz FILE_FORMAT = (FORMAT_NAME = your_updated_file_format) ERROR_ON_COLUMN_COUNT_MISMATCH = FALSE VALIDATION_MODE = RETURN_ERRORS;
注意:这是临时排查方案,找到根本原因后建议移除该参数,确保数据完整性。
内容的提问来源于stack exchange,提问作者Robertino Bonora

