如何通过ADF将SFTP上传至Azure存储账户的文件统一重命名日期格式?
解决Azure Data Factory中基于原文件名日期格式统一重命名的问题
你可以通过ADF的动态表达式,提取原文件名中的日期部分,判断其格式后转换为目标格式,最终拼接成统一命名的文件名。以下是具体实现方案:
核心动态表达式
适用于固定前缀(如fileName_)的场景:
'fileName_', formatDateTime( if( not(isError(tryParseDateTime(split(split(item().name, '_')[1], '.')[0], 'yyyy-MM-dd'))), tryParseDateTime(split(split(item().name, '_')[1], '.')[0], 'yyyy-MM-dd'), tryParseDateTime(split(split(item().name, '_')[1], '.')[0], 'dd-MM-yyyy') ), 'yyyyMMdd' ), '.csv' )``` 如果原文件名的前缀不固定(需保留原前缀),可以使用以下通用表达式: ```@concat( split(item().name, '_')[0], '_', formatDateTime( if( not(isError(tryParseDateTime(split(split(item().name, '_')[1], '.')[0], 'yyyy-MM-dd'))), tryParseDateTime(split(split(item().name, '_')[1], '.')[0], 'yyyy-MM-dd'), tryParseDateTime(split(split(item().name, '_')[1], '.')[0], 'dd-MM-yyyy') ), 'yyyyMMdd' ), '.csv' )``` ## 表达式拆解说明 - **提取日期字符串** `split(split(item().name, '_')[1], '.')[0]` 先按下划线`_`拆分文件名,取第二部分(包含日期和后缀);再按点`.`拆分,取第一部分得到纯日期字符串(如`25-10-2024`或`2024-10-25`)。 - **判断并解析日期** `if(not(isError(tryParseDateTime(..., 'yyyy-MM-dd'))), tryParseDateTime(..., 'yyyy-MM-dd'), tryParseDateTime(..., 'dd-MM-yyyy'))` 先用`yyyy-MM-dd`格式尝试解析日期,`isError()`判断是否解析成功;如果解析成功(说明是`yyyy-MM-dd`格式),直接使用该日期对象;否则用`dd-MM-yyyy`格式解析。 - **格式化日期为目标格式** `formatDateTime(解析后的日期对象, 'yyyyMMdd')` 将解析后的日期对象转换为`yyyyMMdd`格式的字符串(如`20241025`)。 - **拼接新文件名** 通过`concat()`函数将前缀、格式化后的日期和后缀`.csv`拼接成最终文件名。 ## 使用场景 - **ForEach循环+Rename活动**:先用Get Metadata活动获取SFTP或存储账户中的文件列表,在ForEach活动中遍历每个文件,将上述表达式作为Rename活动的目标文件名。 - **Copy活动Sink端**:如果是通过Copy活动迁移文件,可在Sink的文件名设置中使用该动态表达式,直接生成统一命名的文件。 内容的提问来源于stack exchange,提问作者Kevin Vallot
相关产品推荐
相关产品推荐

