Snowflake表中文件名转驼峰式:如何避免扩展名首字母大写?
解决Snowflake中文件名驼峰转换时扩展名意外大写的问题
你当前使用以下SQL实现文件名驼峰转换,但结果里扩展名(如.Txt)的首字母被意外大写,需要保留扩展名全小写的驼峰格式:
SELECT REPLACE(INITCAP(REPLACE(LOWER('ABC_defg_HiJk_lMn_123.txt'),'_',' ')),' ','_');
示例对比
- 源文件名:
'ABC_defg_HiJk_lMn_123.txt' - 当前转换结果:
'Abc_Defg_Hijk_lmn_123.Txt' - 期望结果:
'Abc_Defg_Hijk_lmn_123.txt'
优先方案:正则表达式实现
利用Snowflake的REGEXP_REPLACE函数,拆分文件名主体与扩展名,仅对主体做驼峰转换,保留扩展名小写:
方法1:分组匹配拆分处理
SELECT REGEXP_REPLACE( LOWER('ABC_defg_HiJk_lMn_123.txt'), '^(.*?)(\.[^.]+)$', REPLACE(INITCAP(REPLACE('\\1', '_', ' ')), ' ', '_') || '\\2' ) AS camel_case_filename;
逻辑说明:
- 正则
^(.*?)(\.[^.]+)$将文件名分为两组:\\1捕获最后一个点前的所有内容(文件名主体),\\2捕获从最后一个点开始的完整扩展名(如.txt) - 先将整个文件名转小写,对主体部分执行你原有的驼峰转换逻辑,最后拼接保留原格式的扩展名
方法2:正则直接替换驼峰(更简洁)
SELECT REGEXP_REPLACE( LOWER('ABC_defg_HiJk_lMn_123.txt'), '(_|^)([a-z])(?![^.]*$)', '\\1\\U\\2' ) AS camel_case_filename;
逻辑说明:
- 正则
(_|^)([a-z])(?![^.]*$)匹配下划线或字符串开头后的小写字母,且该字母不在扩展名区域((?![^.]*$)确保后续内容不是到结尾都没有点,即排除扩展名部分) \\1\\U\\2将匹配到的小写字母转为大写,同时保留下划线或开头位置,实现驼峰格式
备选方案:字符串函数拆分处理
如果对正则不太熟悉,也可以用SPLIT_PART拆分文件名和扩展名:
SELECT REPLACE(INITCAP(REPLACE(LOWER(SPLIT_PART('ABC_defg_HiJk_lMn_123.txt', '.', 1)), '_', ' ')), ' ', '_') || '.' || LOWER(SPLIT_PART('ABC_defg_HiJk_lMn_123.txt', '.', 2)) AS camel_case_filename;
逻辑说明:
SPLIT_PART(..., '.', 1)提取点之前的文件名主体,执行原驼峰转换逻辑SPLIT_PART(..., '.', 2)提取扩展名并强制转小写,最后拼接两部分
内容的提问来源于stack exchange,提问作者BabaGee
相关产品推荐
相关产品推荐

