gpt4 book ai didi

ssis - 如何在Foreach文件枚举器的FileSpec属性上设置表达式?

转载 作者:行者123 更新时间:2023-12-04 13:23:53 25 4
gpt4 key购买 nike

我试图创建一个SSIS包来处理包含多年文件的目录中的文件。这些文件都以数字命名,因此,为了节省处理所有事情,我想给SSIS传递一个最小数字,并且只枚举其名称(转换为数字)大于我的最小数字的文件。

我尝试让 ForEach文件循环枚举所有内容,然后在脚本任务中排除文件,但是当处理成千上万个文件时,这种方法太慢了,不适合使用。

FileSpec 属性使您可以指定文件掩码来指示要在集合中包含哪些文件,但是我不太清楚如何指定表达式来使其起作用,因为它本质上是字符串匹配。

如果组件内的某个表达式基本上说了Should I Enumerate? - Yes / No,那将是完美的。我一直在尝试以下表达式,但是找不到要对其应用的属性。

(DT_I4)REPLACE( SUBSTRING(@[User::ActiveFilePath],FINDSTRING( @[User::ActiveFilePath], "\", 7 ) + 1 ,100),".txt","") > @[User::MinIndexId] ? "True" : "False"

最佳答案

这是您可以实现此目的的一种方法。您可以结合使用Expression TaskForeach Loop Container来匹配文件名的数值。这是一个说明如何执行此操作的示例。该示例使用SSIS 2012

这可能不是很有效,但它是实现此目的的一种方法。

假设有一个文件夹,其中包含以YYYYMMDD格式命名的一堆文件。该文件夹包含自1921年以来每个月的第一天的文件,如19210101、19210201、19210301 ....直到当前月份20121101。这总共增加了1,103文件。

假设只需要循环遍历自1948年6月以来创建的文件。这意味着SSIS程序包只必须循环遍历大于19480601的文件。

在SSIS包上,创建以下三个参数。最好为这些参数配置参数,因为这些值可以在整个环境中配置。

  • ExtensionToMatch-String数据类型的此参数将包含程序包必须循环通过的扩展名。这会将值补充到将在Foreach循环容器上使用的FileSpec变量中。
  • FolderToEnumerate-String数据类型的此参数将存储包含要循环通过的文件的文件夹路径。
  • MinIndexId-Int32数据类型的此参数将包含最小数字值,在该最小数字值上文件应与模式匹配。


  • 创建以下四个参数,这些参数将帮助我们循环浏览文件。
  • ActiveFilePath-String数据类型的此变量将保存文件名,因为Foreach循环容器循环遍历文件夹中的每个文件。此变量用于另一个变量的表达式中。为避免错误,请将其设置为非空值,例如1。
  • FileCount-这是Int32数据类型的虚拟变量,将用于此示例,以说明Foreach循环容器将循环通过的文件数。
  • FileSpec-String数据类型的此变量将保留要循环通过的文件模式。将此变量的表达式设置为下面提到的值。该表达式将使用参数上指定的扩展名。如果没有扩展名,它将*.*循环遍历所有文件。

  • "*" + (@[$Package::ExtensionToMatch] == "" ? ".*" : @[$Package::ExtensionToMatch])


  • ProcessThisFile-Boolean数据类型的此变量将评估特定文件是否符合条件。


  • 如下所示配置程序包。 Foreach循环容器将循环遍历与 FileSpec变量上指定的模式匹配的所有文件。在表达式任务上指定的表达式将在运行时求值,并将填充变量ProcessThisFile。然后,该变量将用于“优先级”约束,以确定是否处理文件。

    对于成功匹配表达式的每个文件,Foreach循环容器中的脚本任务将使 FileCount变量的计数器增加1。

    Foreach循环外的脚本任务将仅显示Foreach循环容器循环了多少文件。

    配置Foreach循环容器,以使用参数遍历文件夹,并使用变量遍历文件。

    在循环遍历每个文件时,将文件名存储在变量 ActiveFilePath中。

    在“表达式”任务上,将表达式设置为以下值。该表达式会将不带扩展名的文件名转换为数字,然后检查其计算结果是否大于参数 MinIndexId中的给定数字

    @[User::ProcessThisFile] = (DT_BOOL)((DT_I4)(REPLACE(@[User::ActiveFilePath], @[User::FileSpec] ,"")) > @[$Package::MinIndexId] ? 1: 0)



    右键单击Precedence约束并将其配置为在表达式上使用变量 ProcessThisFile。这告诉程序包仅在与表达式任务上设置的条件匹配时才处理文件。

    @[User::ProcessThisFile]



    在第一个脚本任务中,我将变量 User::FileCount设置为ReadWriteVariables,并在脚本任务中设置了以下C#代码。这将使成功符合条件的文件的计数器增加。
    public void Main()
    {
    Dts.Variables["User::FileCount"].Value = Convert.ToInt32(Dts.Variables["User::FileCount"].Value) + 1;
    Dts.TaskResult = (int)ScriptResults.Success;
    }

    在第二个脚本任务中,我将变量 User::FileCount设置为ReadOnlyVariables,并在脚本任务中设置了以下C#代码。这仅输出已处理的文件总数。
    public void Main()
    {
    MessageBox.Show(String.Format("Total files looped through: {0}", Dts.Variables["User::FileCount"].Value));
    Dts.TaskResult = (int)ScriptResults.Success;
    }

    在将MinIndexId设置为 1948061(不包括此值)的情况下执行包时,它将输出值 773

    在将MinIndexId设置为 20111201(不包括此值)的情况下执行包时,它将输出值 11

    希望能有所帮助。

    关于ssis - 如何在Foreach文件枚举器的FileSpec属性上设置表达式?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13256066/

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