Snowflake中如何将CSV导入的带双引号数组转为标准数组
解决方案
问题根源
你当前的COPY命令直接将t.$2::array转换时,因为CSV里的字段被"包裹,内部的逗号会被当作字段内容而非分隔符,所以整个"a, b, c"被解析成单个字符串元素,最终形成只有一个元素的数组["a, b, c"]。
修正方法
需要先提取字段的原始字符串值,再对其拆分、清理空格后转换为标准数组,具体修改COPY命令的子查询部分即可:
1. 通用兼容方案(适配有无空格的分隔场景)
用正则拆分来兼容字段内a, b, c或a,b,c的格式,将原来的t.$2::array这类转换替换为:
REGEXP_SPLIT_TO_ARRAY(TRIM(t.$2, '"'), ',\\s*')
TRIM(t.$2, '"'):去掉字段前后的双引号,得到纯内容字符串REGEXP_SPLIT_TO_ARRAY(..., ',\\s*'):按逗号加任意数量空格的规则拆分字符串,自动忽略元素间的空格- 无需额外转
::ARRAY,因为该函数直接返回数组类型
2. 完整修正后的COPY命令
copy into stage_table (domain, primary_iab_v1_0, related_iab_v1_0, urg1, urg2, urg3, primary_iab_v2_2, related_iab_v2_2, file_name) from (select t.$1 as domain , REGEXP_SPLIT_TO_ARRAY(TRIM(t.$2, '"'), ',\\s*') as primary_iab_v1_0 , REGEXP_SPLIT_TO_ARRAY(TRIM(t.$3, '"'), ',\\s*') as related_iab_v1_0 , t.$4 as urg1 , t.$5 as urg2 , t.$6 as urg3 , REGEXP_SPLIT_TO_ARRAY(TRIM(t.$9, '"'), ',\\s*') as primary_iab_v2_2 , REGEXP_SPLIT_TO_ARRAY(TRIM(t.$10, '"'), ',\\s*') as related_iab_v2_2 , METADATA$FILENAME as file_name from @stage_location t) on_error = skip_file force = true files = (:file_names) file_format = (type = 'CSV' field_delimiter = ',' field_optionally_enclosed_by = '"' skip_header=1);
验证方式
可以单独测试转换逻辑,确认结果符合预期:
SELECT REGEXP_SPLIT_TO_ARRAY(TRIM('"a, b, c"', '"'), ',\\s*') AS test_array;
返回结果就是标准数组["a","b","c"]。
内容的提问来源于stack exchange,提问作者Sara
相关产品推荐
相关产品推荐

