根据通配符文件名复制文件;从 SFTP 到 Blob 存储 - Azure 数据工厂 - 复制活动

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

我在 SFTP 服务器上有一个文件列表,我想将其中一些文件复制并移动到 blob 存储容器。文件名应与通配符匹配:

(SCUST_TXT)[0-9]*(-)[0-9]*(-)[0-9]*(.)(CSV)

我已按照以下步骤操作,管道运行正常,但文件未移动:

  1. 在 Azure 数据工厂中创建了一个新管道
  2. 添加了“复制和移动”活动
  3. 创建了源数据集和链接服务来连接SFTP
  4. 创建了接收器数据集和链接服务来连接 blob 存储
  5. 在源代码中,我选择了通配符路径并在通配符文件名中使用了上述正则表达式。

管道运行成功,但没有移动匹配的文件。在 SFTP 服务器中,我有 3 个 csv 文件,但其中只有两个与通配符匹配。我原本以为会在储物柜里看到这两个人,但事实并非如此。恐怕通配符模式可能是错误的。这是示例文件名:

SCUST_TXT20240417-032938-891.CSV
.

如果我将通配符文件名更改为:*.CSV,管道会将所有三个文件移动到目标(接收器)。所以我认为这是通配符模式的问题。

regex azure azure-data-factory wildcard
1个回答
0
投票

目前,ADF 通配符路径不支持正则表达式。正则表达式只能在 ADF 数据流表达式中使用。

由于您的源数据来自自托管集成运行时,因此您无法直接使用数据流来获取源文件路径。

相反,将源文件名从获取元数据活动传递到数据流,并从数据流中获取所需文件名的列表。

为此,首先您需要一个位于 Blob 存储临时位置的虚拟 csv 文件,其中包含一个标题和一行。

enter image description here

现在,为您的 SFTP 数据集提供路径,直到获取元数据活动的文件夹,然后选择

ChildItems
字段。

调试时会给出如下输出数组。

"childItems": [
        {
            "name": "LowFixone.csv",
            "type": "File"
        },
        {
            "name": "SCUST_20240417-032938-891.CSV",
            "type": "File"
        },
        {
            "name": "SCUST_TXT20240417-032924-826.CSV",
            "type": "File"
        },
        {
            "name": "SCUST_TXT20240417-032938-891.CSV",
            "type": "File"
        },
        {
            "name": "SCUST_TXT20240420-032938-ok.CSV",
            "type": "File"
        }
    ]

使用下面的表达式将上面的数组更改为类似

name1,name2,name3,.
的字符串。

@replace(replace(replace(replace(string(split(replace(replace(replace(string(activity('Get Metadata1').output.childItems),'"',''),'[',','),']',''),',type:File}')),'"',''),'[',''),']',''),',{name:','')

将此表达式赋予 String 类型设置变量 Activity。

enter image description here

它将像下面这样的字符串。

enter image description here

在数据流中,将虚拟数据集作为源并创建一个具有空默认值的字符串参数。

enter image description here

通过数据流活动将变量传递给此参数。

enter image description here

在数据流中,进行派生列转换并使用以下表达式创建一个新列。在这里,给出你的正则表达式。这会过滤掉所需的文件名。

mapIf(slice(split($str_param,','),1,size(split($str_param,','))-1),regexMatch(#item, '(SCUST_TXT)[0-9]*(-)[0-9]*(-)[0-9]*(.)(CSV)'),#item)

enter image description here

要将结果数组返回到管道中,请使用数据流接收器缓存。像下面一样设置接收器缓存。

enter image description here

现在,调试管道,您将在数据流输出中获得一个包含所需文件名的数组。

enter image description here

您可以在数据流活动后使用以下表达式获取此数组。

@activity('Data flow1').output.runStatus.output.sink1.value[0].filenames

您需要使用 For-each 并传递此数组。 For-Each 内部使用复制活动,以 SFTP 作为源,Blob 作为目标。您的源数据集和目标数据集应在文件名上参数化,以便您可以将此文件名从每次迭代传递给那些

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