azure 如何使用ADF检查和比较文件夹(Datalake)中的文件名

eqfvzcg8  于 2022-11-25  发布在  其他
关注(0)|答案(1)|浏览(279)

我的要求是将Datalake文件夹中的文件名与.CSV文件中的文件名进行比较,如果文件名匹配,则我希望复制这些文件,如果文件名不匹配,则我希望将这些文件名存储在datalake中的.CSV文件中。
请帮助。

ffscu2ro

ffscu2ro1#

您可以通过以下3个步骤实现此要求,即从csv文件和ADLS文件夹中获取文件名,过滤匹配和不匹配的文件名(从文件夹中),最后执行相应的复制操作。

步骤1

  • 我使用get metadata活动从ADLS文件夹(sample1.csv、sample2.csv、sample3.csv、sample4.csv)中获取文件名列表。创建指向您的文件夹的数据集,并使用child items作为字段列表。

  • look up从csv文件中获取文件名(sample1.csv、sample2.csv、sample5.csv、sample6.csv)。

步骤2

  • 现在使用筛选活动,获取匹配的文件名。我使用以下项和筛选条件来获取匹配的文件名:
items- @activity('list of files in folder').output.childItems
condition- @contains(string(activity('filenames present in csv').output.value),item().name)

  • 为了从ADLS文件夹中获取不匹配的文件名,我使用了以下项和筛选条件:
items- @activity('list of files in folder').output.childItems
condition- @not(contains(string(activity('filenames present in csv').output.value),item().name))

步骤3:

  • 现在,使用for each activity将每个文件复制到另一个位置。我在1st中使用的items值为@activity('getting matching files').output.Value for each。在此,我配置了一个copy activity来复制每个项目的当前值(即filename)。
  • 我在dataset中创建了一个名为filename的参数。我从复制数据源设置中传递了它的值(@item().name),如下所示。

x1c4d 1x指令集

  • 现在,对于文件夹中不匹配的文件名,我使用for each和append变量创建一个文件名数组,如["sample3.csv", "sample4.csv"]
  • 在内部,我使用了append variable,值为@item().name

  • 现在,我们必须创建一个新的csv文件,其中包含文件夹中所有不匹配的文件名。使用复制数据活动,取一个sample csv file(包含一些内容。这些内容无关紧要,我们只需要一个文件作为源文件)。
  • 现在添加一个名为filenames的附加列,其动态内容值如下所示。(确保pipeline JSON中的filenames值与this reference image中的值相同)
@join(variables('filenames'),'
')

#the values will be joined using newline(\n). 
#Using \n directly in dynamic content would not work as it will be taken as \\n. 
#So change it in pipeline json as in above reference image.


指令集

  • 按如下所示配置接收器。选择路径、文件名,并确保将引号字符选择为no quote character

输出:

  • 当我运行管道时,它会生成所需的输出。匹配和复制的文件生成如下:


指令集

  • 写入csv文件的不匹配文件名如下所示:


指令集

相关问题