gpt4 book ai didi

sql-server - SQL Server 2012 Foreach 文件夹中的 SSIS

转载 作者:行者123 更新时间:2023-12-02 09:32:44 29 4
gpt4 key购买 nike

我已经与这个问题作了一段时间的斗争,但我似乎没有取得任何进展,而且我读过的几种方法似乎对我不起作用(无论出于何种原因) .

我的文件夹结构如下:

--Main Folder
--subfolder1
--file1.txt
--file2.txt
--file3.txt
--subfolder2
--file4.txt
--file5.txt
--file6.txt

使用 ForEach 文件枚举器,我能够毫无问题地处理任何给定目录中的每个文件,但是我终究无法弄清楚如何遍历目录。

我将基本路径目录设置为变量。我想在 SSIS 中达到的目的如下:

foreach folder in mainfolder
do
set variable to the folder name (i.e. subfolder1 (no path))
foreach file in folder
do
Process File steps (can do this currently by specifying one of the sub folders)
done
done

希望这是有道理的。

正如我之前提到的,我已经尝试了几种方法,包括一个脚本来构建一个 XML blob,其中包含每个文件夹路径,然后遍历节点,但是这没有用,我相信一定有更简单的方法方法。

总而言之,我需要一个 foreach 文件夹外循环,它将一个变量设置为文件夹名称,以便我可以在其中嵌套现有的 foreach 文件循环。

可能是我正在尝试做一些 SSIS 无法做的事情,我觉得应该这样做,因为我在编程语言中做过类似的事情

最佳答案

Foreach 文件枚举器不返回目录。在我开始回答这个问题之前,我并没有意识到这一点。

设置

我在基本文件夹下创建了一系列文件夹和文件,就像您指出的那样

C:\SSISData\31081157
C:\SSISData\31081157\Subfolder1
C:\SSISData\31081157\Subfolder2
C:\SSISData\31081157\Subfolder1\file1.txt
C:\SSISData\31081157\Subfolder1\file2.txt
C:\SSISData\31081157\Subfolder1\file3.txt
C:\SSISData\31081157\Subfolder2\file4.txt
C:\SSISData\31081157\Subfolder2\file5.txt
C:\SSISData\31081157\Subfolder2\file6.txt

我构建了一个包含 4 个变量的包

  • CurrentFile - 字符串 - 值无关紧要
  • CurrentFolder - 字符串 - 值无关紧要
  • FolderBase - 字符串 - 将此值设置为要处理的基/根/父文件夹
  • 子文件夹列表 - 对象

enter image description here

第一轮

我最初的构建看起来像

enter image description here

FELC 流程文件夹

我用 @[User::FolderBase] 的目录设置它,并且未选中遍历子文件夹。我的变量映射选项卡使用 User::CurrentFolder 作为索引 0

FELC 过程文件

我用 @[User::CurrentFolder] 目录设置它,我的变量映射选项卡使用 User::CurrentFile 作为索引 0

SCR 发射

这是一个接受两个只读参数的脚本任务:UserFolder 和 UserBase。我只是想通过引发 OnInformation 事件(显示在“进度”选项卡中)来使用它来显示当前值。

  • 只读变量:用户::当前文件,用户::当前文件夹
  • 读写变量:

代码很简单

public void Main()
{
bool fireAgain = false;
string folderName = this.Dts.Variables["User::CurrentFolder"].Value.ToString();
string fileName = this.Dts.Variables["User::CurrentFile"].Value.ToString();
string message = string.Format("Folder = {0} : File = {1}", folderName, fileName);
Dts.Events.FireInformation(0, "Emit", message, string.Empty, 0, ref fireAgain);

Dts.TaskResult = (int)ScriptResults.Success;
}

但它永远不会触发内部 foreach 循环,因为外部循环中没有文件。糟糕

第二轮

这可能是我最初解决这个问题的方式。我没有先找出我所有的目录,而是简单地遍历树,然后找出我在哪里。

enter image description here

FELC 子文件夹

我用 @[User::FolderBase] 的目录设置它,并检查左遍历子文件夹。我的变量映射选项卡使用 User::CurrentFile 作为索引 0

SCR 分配当前文件夹

这是一个将使用 .NET 库查找 containing folder 的脚本

  • 只读变量:用户::当前文件
  • 读写变量:用户::当前文件夹

代码保持简单

public void Main()
{
string currentFile = this.Dts.Variables["User::CurrentFile"].Value.ToString();
string parent = System.IO.Directory.GetParent(currentFile).FullName;
this.Dts.Variables["User::CurrentFolder"].Value = parent;
Dts.TaskResult = (int)ScriptResults.Success;
}

SCR 发射

同上

第三轮

这假设您在深入了解文件夹之前必须知道该文件夹。在这种情况下,我们将再次回到 .NET 库来检查文件系统,但现在我们将使用子文件夹列表填充最后一个变量 User::SubFolderList。从技术上讲,它是一个字符串数组,但没关系。

enter image description here

SCR 生成子文件夹列表

使用 Directory.GetDirectories 中的静态方法返回文件夹列表的脚本任务。

  • ReadOnlyVariables: User::FolderBase
  • 读写变量:用户::子文件夹列表

代码也很简单

public void Main()
{
string folder = this.Dts.Variables["User::FolderBase"].Value.ToString();
this.Dts.Variables["User::SubFolderList"].Value = System.IO.Directory.GetDirectories(folder);

Dts.TaskResult = (int)ScriptResults.Success;
}

FELC 进程子文件夹列表

这是一个 Foreach 枚举器,但我们必须将文件类型从文件列表设置为 Foreach From Variable Enumerator。作为您的变量,您将使用@[User::SubFolderList]。我的变量映射选项卡使用 User::CurrentFolder 作为索引 0

当前文件夹中的 FELC 处理文件

既然我们知道 CurrentFolder 是什么,那么我们将使用 Foreach 文件枚举器并指定 @[User::CurrentFolder] 的目录。我将我的变量映射选项卡设置为使用 User::CurrentFile 作为索引 0

SCR 发射

同上

结果

如您所见,我使用方法 2 和方法 3 得到了相同的结果。这仅取决于哪种方法对您的特定用例更有意义。

enter image description here

关于sql-server - SQL Server 2012 Foreach 文件夹中的 SSIS,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31081157/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com