1

我在 SSIS 遇到了一个有趣的挑战。使用 for-each 文件枚举器,我需要选择最近创建的子文件夹,然后遍历每个文件。

也许一个例子会更好地解释。文件夹如下所示:

c:\数据\2011-0703

c:\数据\2011-0626

c:\数据\2011-0619

您如何为每个文件枚举器选择最近的文件夹?这可以通过查看创建日期或比较文件名来实现。

我猜这将通过枚举器中的表达式来完成,只是无法弄清楚如何!在网上也找不到任何东西。

谢谢

4

2 回答 2

5

这是一个可能的选项,您可以借助Script Task. 以下示例显示了如何做到这一点。该示例是在 SSIS 2008 R2 中创建的。

分步过程:

  1. 创建三个文件夹,命名为,2011-0619文件夹路径如截图# 1所示。记下每个文件夹的值。2011-06262011-0703C:\temp\Date created

  2. 在每个文件夹中放置几个​​文件,如屏幕截图 # 2 - # 4所示。

  3. 在 SSIS 包上,创建四个变量,如屏幕截图 # 5所示。使用值设置变量RootFolderC:\temp\(在您的情况下,这将是 c:\data)。将变量FilePattern设置为value *.*。变量RecentFolder将被分配脚本任务中最近的文件夹路径。为避免设计时错误,请为变量RecentFolder分配一个有效的文件路径。当文件在最近的文件夹中循环时,将为变量FilePath分配值。

  4. 在 SSIS 包上,放置一个脚本任务。将脚本任务中的 Main() 方法替换为脚本任务代码(获取最近的文件夹)部分下给出的脚本任务代码:。此脚本获取根文件夹中的文件夹列表并循环检查创建日期时间以选择最近创建的文件夹。然后将最近创建的文件夹路径存储在变量RecentFolder中。

  5. 在 SSIS 包上,放置一个 Foreach 循环容器并按照屏幕截图 # 6和 # 7所示对其进行配置。

  6. 在 Foreach 循环容器中放置一个脚本任务。将脚本任务中的 Main() 方法替换为脚本任务代码(显示文件名)部分下给出的脚本任务代码:。此脚本仅显示最近创建的文件夹中的文件名。

  7. 配置完所有任务后,包应如屏幕截图 # 8所示。

  8. 屏幕截图 # 9 - # 11显示包显示最近创建的文件夹2011-0703中的文件名。

希望有帮助。

脚本任务代码(获取最近的文件夹):

只能在SSIS 2008 及更高版本中使用的C#代码。

public void Main()
{
    Variables varCollection = null;

    Dts.VariableDispenser.LockForRead("User::RootFolder");
    Dts.VariableDispenser.LockForWrite("User::RecentFolder");
    Dts.VariableDispenser.GetVariables(ref varCollection);

    string rootFolder = varCollection["User::RootFolder"].Value.ToString();
    DateTime previousFolderTime = DateTime.MinValue;
    string recentFolder = string.Empty;

    foreach (string subFolder in System.IO.Directory.GetDirectories(rootFolder))
    {
        DateTime currentFolderTime = System.IO.Directory.GetCreationTime(subFolder);
        if (previousFolderTime == DateTime.MinValue || previousFolderTime <= currentFolderTime)
        {
            previousFolderTime = currentFolderTime;
            recentFolder = subFolder;
        }
    }

    varCollection["User::RecentFolder"].Value = recentFolder;

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

脚本任务代码(显示文件名):

只能在SSIS 2008 及更高版本中使用的C#代码。

public void Main()
{
    Variables varCollection = null;

    Dts.VariableDispenser.LockForRead("User::FilePath");
    Dts.VariableDispenser.GetVariables(ref varCollection);

    MessageBox.Show(varCollection["User::FilePath"].Value.ToString(), "File Path");

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

截图#1:

1

截图#2:

2

截图#3:

3

截图#4:

4

截图#5:

5

截图#6:

6

截图#7:

7

截图#8:

8

截图#9:

9

截图#10:

10

截图 #11:

11

于 2011-07-13T19:09:58.987 回答
0

遍历文件夹。保存第一个的名称。将该保存的值与每个后续文件夹的名称进行比较。如果下一个文件夹是更新的,则换掉该名称并继续。最后,您保存的值将是最新文件夹的名称(如果您要比较创建日期,则需要同时保存文件夹名称和创建日期)。

然后,您可以将保存的值用作第二次迭代循环的参数。

于 2011-07-04T13:30:12.167 回答