【问题标题】:How do I pick the most recently created folder using Foreach loop container in SSIS package?如何使用 SSIS 包中的 Foreach 循环容器选择最近创建的文件夹?
【发布时间】:2011-09-28 03:36:41
【问题描述】:

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

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

c:\data\2011-0703

c:\data\2011-0626

c:\data\2011-0619

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

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

谢谢

【问题讨论】:

    标签: file ssis ienumerator


    【解决方案1】:

    这是一种可能的选择,您可以在Script Task 的帮助下实现这一目标。以下示例显示了如何做到这一点。该示例是在 SSIS 2008 R2 中创建的。

    分步过程:

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

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

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

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

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

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

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

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

    希望对您有所帮助。

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

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

    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;
    }
    

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

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

    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:

    屏幕截图 #2:

    截图#3:

    屏幕截图 #4:

    屏幕截图 #5:

    屏幕截图 #6:

    截图#7:

    截图#8:

    屏幕截图 #9:

    屏幕截图 #10:

    屏幕截图 #11:

    【讨论】:

    • 哇!谢谢 - 这个答案太棒了!对于其他阅读者 - 在屏幕截图 6 中,我还必须设置表达式映射 (Directory = @[User::RecentFolder])
    • 我怎样才能得到最近的文件???我想从最近的 .CSV 文件中插入数据到 SQL 表帮助
    【解决方案2】:

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

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

    【讨论】:

    • 您能否提供更多详细信息,您将如何实际执行此操作?我猜这将是每个枚举器的一个,你会将文件名存储在一个变量中。您将如何比较和更新变量? (SSIS 菜鸟 - 如果很简单,对不起)
    猜你喜欢
    • 1970-01-01
    • 2020-07-28
    • 2023-03-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多