我在 SFTP 服务器上有一个文件列表,我想将其中一些文件复制并移动到 blob 存储容器。文件名应与通配符匹配:
(SCUST_TXT)[0-9]*(-)[0-9]*(-)[0-9]*(.)(CSV)
。
我已按照以下步骤操作,管道运行正常,但文件未移动:
管道运行成功,但没有移动匹配的文件。在 SFTP 服务器中,我有 3 个 csv 文件,但其中只有两个与通配符匹配。我原本以为会在储物柜里看到这两个人,但事实并非如此。恐怕通配符模式可能是错误的。这是示例文件名:
SCUST_TXT20240417-032938-891.CSV
.
如果我将通配符文件名更改为:*.CSV,管道会将所有三个文件移动到目标(接收器)。所以我认为这是通配符模式的问题。
目前,ADF 通配符路径不支持正则表达式。正则表达式只能在 ADF 数据流表达式中使用。
由于您的源数据来自自托管集成运行时,因此您无法直接使用数据流来获取源文件路径。
相反,将源文件名从获取元数据活动传递到数据流,并从数据流中获取所需文件名的列表。
为此,首先您需要一个位于 Blob 存储临时位置的虚拟 csv 文件,其中包含一个标题和一行。
现在,为您的 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。
它将像下面这样的字符串。
在数据流中,将虚拟数据集作为源并创建一个具有空默认值的字符串参数。
通过数据流活动将变量传递给此参数。
在数据流中,进行派生列转换并使用以下表达式创建一个新列。在这里,给出你的正则表达式。这会过滤掉所需的文件名。
mapIf(slice(split($str_param,','),1,size(split($str_param,','))-1),regexMatch(#item, '(SCUST_TXT)[0-9]*(-)[0-9]*(-)[0-9]*(.)(CSV)'),#item)
要将结果数组返回到管道中,请使用数据流接收器缓存。像下面一样设置接收器缓存。
现在,调试管道,您将在数据流输出中获得一个包含所需文件名的数组。
您可以在数据流活动后使用以下表达式获取此数组。
@activity('Data flow1').output.runStatus.output.sink1.value[0].filenames
您需要使用 For-each 并传递此数组。 For-Each 内部使用复制活动,以 SFTP 作为源,Blob 作为目标。您的源数据集和目标数据集应在文件名上参数化,以便您可以将此文件名从每次迭代传递给那些