从 adls 复制到 adls 时重命名复制活动中的文件

问题描述 投票:0回答:1

我有一个 adf 管道,它将数据从 ssms 表复制到名为 stage 的 adls 文件夹。 我有另一个管道,它使用复制活动将文件从 adls stage 复制到 adls dest

但是我想在复制到目标文件夹时重命名文件

例如:如果我在 stage 中的文件名具有以下名称:

20231115023654DLondon_00001.csv

所以基本上前 14 个字符是时间戳,后跟负载类型,这里是增量负载和表名,后跟分区(始终是从 00000 到 99999 的 5 位数字)

我希望目标中的文件名是:

20231115023655DLondon.csv

这里发生的是下划线后面的数字与文件名的 hhmmss 添加,然后下划线和下划线后面的 5 位数字被删除

我应该在复制活动的接收器数据集的文件名中写入什么查询?

我尝试使用以下查询:

@concat(子字符串(数据集()。Renamed_FL,0,indexOf(数据集()。Renamed_FL,'__)),

string(add(int (substring(dataset().Renamed_FL,indexOf(dataset()).

Renamed_FL, `_'),5)), int(substring(dataset().Renamed_FL,8,6)))),'.csv')

管道运行时出现错误: 使用无效参数调用函数“int”。该值无法转换为目标类型

copy azure-data-factory file-rename azure-data-lake-gen2
1个回答
0
投票

在表达式

(int (substring(dataset(). Renamed_FL, indexOf(dataset().Renamed_FL, '_'),5))
中,结果值不是字符串。 substring函数的输出从下划线
_
开始。因此,它会导致错误。为了克服这个错误,并达到您的要求,您可以使用下面的表达式。

@concat(substring(dataset().Renamed_FL, 0, 8),substring(concat('000000',string(add(int(substring(dataset().Renamed_FL,9,6)),
int(substring(dataset().Renamed_FL, add(indexOf(dataset().Renamed_FL,'_'),1),5))))),
sub(length(concat('000000',string(add(int(substring(dataset().Renamed_FL,9,6)),
int(substring(dataset().Renamed_FL, add(indexOf(dataset().Renamed_FL,'_'),1),5)))))),6),6),'.csv')
  • substring(dataset().Renamed_FL, 0, 8)
    :这会提取原始文件名的前 8 个字符。
  • substring(concat('000000',string(add(int(substring(dataset().Renamed_FL,9,6)), int(substring(dataset().Renamed_FL, add(indexOf(dataset().Renamed_FL,'_'),1),5)))))), sub(length(concat('000000',string(add(int(substring(dataset().Renamed_FL,9,6)), int(substring(dataset().Renamed_FL, add(indexOf(dataset().Renamed_FL,'_'),1),5)))))),6),6)
    :提取原始文件名中下划线字符后面出现的字符序列(5 位数字)。该表达式将此序列号添加到一个 6 位数字(表示为字符串)中,该数字表示文件名中的
    hhmmss
    。结果是一个表示新序列号的字符串,该序列号首先用零填充,使其看起来像一个 6 位字符串。
  • '.csv'
    :这是一个字符串,表示新文件的文件扩展名。

使用

concat
函数将上述所有部分连接在一起以创建新文件名。

该表达式在设置变量活动中进行测试,并输出如下。 enter image description here

enter image description here

© www.soinside.com 2019 - 2024. All rights reserved.