我一直在与这个问题作斗争,但我似乎没有取得任何进展,而且我读过的少数方法似乎对我不起作用(无论出于何种原因)。
我有一个文件夹结构如下:
--Main Folder
--subfolder1
--file1.txt
--file2.txt
--file3.txt
--subfolder2
--file4.txt
--file5.txt
--file6.txt
Run Code Online (Sandbox Code Playgroud)
使用 ForEach File 枚举器,我可以在没有任何问题的情况下处理任何给定目录中的每个文件,但是我一生都无法弄清楚如何遍历目录。
我有一个设置为变量的基本路径目录。我想在 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
Run Code Online (Sandbox Code Playgroud)
希望这是有道理的。
正如我之前提到的,我尝试了几种方法,包括一个脚本来构建一个包含每个文件夹路径的 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
Run Code Online (Sandbox Code Playgroud)
我构建了一个包含 4 个变量的包
我最初的构建看起来像
我用@[User::FolderBase] 的目录设置了这个,并且未选中遍历子文件夹。我的变量映射选项卡使用 User::CurrentFolder 作为索引 0
我使用 @[User::CurrentFolder] 的目录设置它,我的变量映射选项卡使用 User::CurrentFile 作为索引 0
这是一个脚本任务,它接受两个只读参数: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;
}
Run Code Online (Sandbox Code Playgroud)
但它永远不会触发内部 foreach 循环,因为外部循环中没有文件。哎呀
这可能是我首先解决这个问题的方法。我没有先找出我所有的目录,而是简单地遍历树,然后找出我在哪里。
我用@[User::FolderBase] 的目录设置了这个,并检查了左遍历子文件夹。我的变量映射选项卡使用 User::CurrentFile 作为索引 0
这是一个将使用 .NET 库来查找包含文件夹的脚本
代码保持简单
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;
}
Run Code Online (Sandbox Code Playgroud)
和上面一样
这假设您在深入研究之前必须知道该文件夹。在这种情况下,我们将再次返回 .NET 库以检查文件系统,但现在我们将使用子文件夹列表填充最后一个变量 User::SubFolderList。从技术上讲,它是一个字符串数组,但无关紧要。
使用 Directory.GetDirectories 中的静态方法返回我们的文件夹列表的脚本任务。
代码也很简单
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;
}
Run Code Online (Sandbox Code Playgroud)
这是一个 Foreach 枚举器,但我们必须将文件类型从 File List 设置为Foreach From Variable Enumerator
. 作为您的变量,您将使用@[User::SubFolderList]。我的变量映射选项卡使用 User::CurrentFolder 作为索引 0
既然我们知道 CurrentFolder 是什么,那么我们将使用 Foreach 文件枚举器并指定 @[User::CurrentFolder] 的目录。我设置我的变量映射选项卡使用 User::CurrentFile 作为索引 0
和上面一样
如您所见,我使用方法 2 和方法 3 得到相同的结果。这仅取决于对您的特定用例更有意义的内容。
归档时间: |
|
查看次数: |
3192 次 |
最近记录: |