加入收藏 | 设为首页 | 会员中心 | 我要投稿 湖南网 (https://www.hunanwang.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程 > 正文

ssis – 如安在Foreach文件列举器上为FileSpec属性配置表达式?

发布时间:2021-03-06 23:15:44 所属栏目:编程 来源:网络整理
导读:我正在实行建设一个SSIS包来处理赏罚包括多年文件的目次中的文件.这些文件都是以数字定名的,所觉得了生涯处理赏罚全部内容,我想转达SSIS最小数目,而且只列举其名称(转换为数字)高于我的最小值的文件. 我试过让ForEach File轮回列举全部内容然后解除剧本使命中的文件,

我正在实行建设一个SSIS包来处理赏罚包括多年文件的目次中的文件.这些文件都是以数字定名的,所觉得了生涯处理赏罚全部内容,我想转达SSIS最小数目,而且只列举其名称(转换为数字)高于我的最小值的文件.

我试过让ForEach File轮回列举全部内容然后解除剧本使命中的文件,可是当处理赏罚成千上万的文件时,这太慢而不得当.

FileSpec属性应承您指定一个文件掩码来指示您在荟萃中必要哪些文件,但我无法完全看到怎样指定表达式以使其事变,由于它本质上是一个字符串匹配.

假如组件内部有一个表达式,根基上说我应该列举吗? – 是/否,这将是美满的.我一向在实行行使下面的表达式,但找不到要应用它的属性.

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

办理要领

这是一种可以实现这一方针的要领.您可以行使表达式使命与Foreach轮回容器相团结来匹配文件名的数值.这是一个声名怎样执行此操纵的示例.该示例行使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 – 此布尔数据范例的变量将评估特定文件是否与前提匹配.

设置包如下所示. Foreach轮回容器将轮回遍历与FileSpec变量上指定的模式匹配的全部文件.表达式使命上指定的表达式将在运行时时代举办评估,并将添补变量ProcessThisFile.然后,该变量将用于Precedence束缚,以确定是否处理赏罚该文件.

对付乐成匹配表达式的每个文件,Foreach轮回容器中的剧本使命将使变量FileCount的计数器增进1.

Foreach轮回外部的剧本使命将仅表现Foreach轮回容器轮回的文件数.

设置Foreach轮回容器以行使参数和行使变量的文件轮回遍历文件夹.

当轮回遍历每个文件时,将文件名存储在变量ActiveFilePath中.

在Expression使命上,将表达式配置为以下值.表达式将没有扩展名的文件名转换为数字,然后搜查它是否在参数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.

但愿有所辅佐.

(编辑:湖南网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    热点阅读