0

我需要将几个文件从 ADLS Gen1 位置复制到另一个 ADLS Gen1 位置,但必须根据文件名创建文件夹。

我在源 ADLS 中有几个文件如下:

ABCD_20200914_AB01_Part01.csv.gz
ABCD_20200914_AB02_Part01.csv.gz
ABCD_20200914_AB03_Part01.csv.gz
ABCD_20200914_AB03_Part01.json.gz
ABCD_20200914_AB04_Part01.json.gz
ABCD_20200914_AB04_Part01.csv.gz

场景 1 我必须将这些文件复制到目标 ADLS 中,如下所示,只有 csv 文件并从文件名创建文件夹(如果文件夹存在,则复制到该文件夹​​):

AB01-
    |-ABCD_20200914_AB01_Part01.csv.gz
AB02-
    |-ABCD_20200914_AB02_Part01.csv.gz
AB03-
    |-ABCD_20200914_AB03_Part01.csv.gz
AB04-
    |-ABCD_20200914_AB04_Part01.csv.gz

场景 2 我必须将这些文件复制到目标 ADLS 中,如下所示,只有 csv 和 json 文件,并从文件名创建文件夹(如果文件夹存在,则复制到该文件夹​​):

AB01-
    |-ABCD_20200914_AB01_Part01.csv.gz
AB02-
    |-ABCD_20200914_AB02_Part01.csv.gz
AB03-
    |-ABCD_20200914_AB03_Part01.csv.gz
    |-ABCD_20200914_AB03_Part01.json.gz
AB04-
    |-ABCD_20200914_AB04_Part01.csv.gz
    |-ABCD_20200914_AB04_Part01.json.gz

有没有办法在数据工厂中实现这一点?感谢任何线索!

4

1 回答 1

2

所以我不确定这是否完全有帮助,但我也遇到过类似的情况,我们有 1 个 zip 文件,我不得不将这些文件复制到他们自己的文件夹中。

因此,您可以做的是在您将使用的数据接收器中使用参数,以及您将在其中执行子字符串的变量活动。

下面的工作更适合增量工作,但我认为其中有足够的东西希望能有所帮助。我的工作可以分为三个部分。

在此处输入图像描述

第一个橙色部分从您要复制的 ADLS gen 1 文件夹中获取最新的文件名日期。

然后它被移动到橙色块。在底部,我根据 ADLS gen 1 日期获得最新的文件名,然后我在其中取出文件的日期部分的子字符串。在您的情况下,您可能能够做一个数组并捕获您需要的所有文件夹名称。

获取文件名 在此处输入图像描述

获取子字符串 在此处输入图像描述

在顶部,我首先提取该文件并将其解压缩到测试着陆区。

资源 在此处输入图像描述

下沉 在此处输入图像描述

然后,我获取该 zip 文件中所有文件的名称,以便在 ForEach 活动中使用它们。这些文件名将成为复制活动的文件夹。

从初始登陆区域获取文件名: 在此处输入图像描述

然后我将这些子项从“获取暂存文件列表”传递到 ForEach:

在此处输入图像描述

在该 ForEach 活动中,我有一个复制活动。为此,我制作了数据集。从我们创建的初始登陆区域获取文件。对于此示例,我们将其称为 Staging(请原谅 ms 绘图):

在此处输入图像描述

这样做的目的是转到那个虚拟文件夹并抓取刚刚复制到那里的每个文件。从该 1 个 zip 文件中,我们预计有 5 个文件。

在 Sink 部分,我所做的是创建一个带有文件夹和文件名参数的新数据集。在该数据集中,我将该数据放入同一个容器中,但创建了一个名为“Stage”的新文件夹并将其与项目名称连接起来。我还添加了一个“替换”命令以从文件名中删除“.txt”。

在此处输入图像描述

然后,这将做什么是来自该虚拟登台的文件名,然后它将具有专门用于每个文件的文件夹名称。根据您的要求,我不确定这是否是您想要做的,但您可以随时修改它以使其更具体。

对于项目名称,我基本上得到相同的文件名,然后替换“.txt”,连接日期值的名称,然后添加“.txt”扩展名。否则我将不得不在文件名中添加“.txt”。

最后,我创建了一个删除活动,然后将用于删除所有文件(我不确定是否已正确设置,因此请随意调整)。

在此处输入图像描述

希望上面的描述能让您了解如何为文件使用参数。如果这对您的情况有帮助,请告诉我。

于 2020-09-14T15:36:54.543 回答