在 Azure DataFactory 中,我想删除特定路径中不包含子字符串(即“2024-04-15”)的所有文件。
我设法通过循环活动来完成此操作,但当特定路径上的文件量很大(大约 1000 个)时,它的成本太高。
因此我想测试通配符,但我一直在尝试对正则表达式使用 not 运算符。
例如,如果我的路径有 3 个文件:
[lorem_2024-04-15.csv, lorem_2024-04-14_test.csv, lorem_2024-04-14.csv]
,我想删除除 lorem_2024-04-15.csv
以外的所有文件。我试过:
Wildcard file name: *^(?!.*2024-04-15).*
但是当尝试预览指向该路径的数据集的数据时:
The escaped character ^( is not recognized for wildcard filter (*, ?).
If you want to use ^ in file name, specify ^^ to escape. Index: 2.
我设法通过循环活动来完成此操作,但是当特定路径上的文件量很大(大约 1000 个)时,它的成本太高。
如果您不想使用循环删除所需的文件,可以按照以下步骤操作:
使用数据流在一个文件中列出所有需要删除的文件:
使用通配符路径添加所需的数据集作为数据流的源,并在源设置中添加一列
filename
,如下图:
您将得到如下所示的文件路径:
接下来,使用聚合转换并在 filename
列上使用
groupBy。在聚合部分中,创建一个新列
filenamecount
并计算样本的文件名 (count(filename)
) 列。
它将给出所有不同的文件路径及其数量。接下来,使用选择转换并从流中删除额外的
filenamecount
列。
现在,对 filename
列使用
衍生列转换,并在其中使用表达式
dropLeft(filename,1)
。这将删除每行中的起始 /
。
现在,使用过滤器转换并使用表达式
not(like(filename, "%2024-04-15%"))
排除包含2024-04-15
的文件名。
接下来,取另一个
DelimitedText
数据集作为数据流的接收器,并给出文件路径。在这里,请确保删除第一行作为标题复选框。
配置接收器设置,如下所示:
执行数据流后,文件将生成一个filename.csv,其中包含所需的文件路径,如下所示:
在数据流活动之后,添加删除活动,选择数据集,然后选择文件列表并浏览 filename.csv 文件。
执行删除活动后,将删除除包含 2024-04-15 的文件之外的所有文件,如下所示: