SSIS 集合中的通配符 {not include} name xlsx
WildCards in SSIS Collection {not include} name xlsx
我在 SSIS 中内置了一个进程,它循环遍历 Excel 个文件,并且仅从包含名称 Report 的文件中导入数据。
用作表达式的我的 UserVariable 是:*Report*.xlsx
它工作得很好。现在我正在尝试构建类似的循环,但仅限于文件名中不包含 Report 的文件。
类似于*<>Report*.xlsx
可能吗?
感谢帮助!
马特
在您的循环中,在您的第一个任务之前放置一个脚本任务。用一条线连接这两个。右键单击该行并将约束选项设置为表达式。你的表情应该是这样的...
FINDSTRING(@var, "Report", 1) == 0
@var 是可迭代的循环。
只有里面没有"Report"的文件才会进行下一步。
引用这个确切的答案。 SSIS Exclude certain files in Foreach Loop Container
不幸的是,您无法使用 SSIS 表达式(类似于 *[^...]*.xlsx
)实现此目的,您必须寻找一些解决方法:
解决方法
第一
在进入循环之前使用 Execute Script Task
获取过滤后的文件列表,然后使用 ForEach 循环容器(Ado 枚举器)进行循环
- 您必须使用类型
System.Object
(范围:包)[=95] 的 SSIS 变量 (例如:User::FilesList
) =]
- 为每个循环容器添加一个
Execute Script Task
并添加 User::FilesList
作为 ReadWrite 变量
在脚本中写入以下代码:
进口System.Linq
进口 System.IO
进口 System.Collections.Generic
Public Sub Main()
Dim lstFiles As New List(Of String)
lstFiles.AddRange(Directory.GetFiles("C:\Temp", "*.xlsx", SearchOption.TopDirectoryOnly).Where(Function(x) Not x.Contains("Report")).ToList)
Dts.Variables.Item("FilesList").Value = lstFiles
Dts.TaskResult = ScriptResults.Success
End Sub
在 For each Loop Container 中选择枚举类型为 'From variable Enumerator' 并选择 FilesList
变量作为源
屏幕截图
第二
在 for each 循环中添加一个 Expression Task
来检查文件是否包含 Report
字符串
- 添加类型为
System.Boolean
的变量 (名称:ExcludeFile)
- 在 ForEach 循环容器中,在导入 Excel 文件
的 DataFlowTask 之前添加一个 Expression Task
组件
在表达式任务中写入以下内容:
@[User::ExcludeFile] = (FINDSTRING(@[User::XlsxFile], "Report", 1 ) == 0)
双击表达式任务和 DataFlowTask 之间的连接器并写入以下表达式
@[User::ExcludeFile] == False
注意:不必使用 Expression Task
来验证这一点,您可以使用 Dummy DataFlowTask 或 脚本任务 检查文件名是否包含您要排除的关键字
我在 SSIS 中内置了一个进程,它循环遍历 Excel 个文件,并且仅从包含名称 Report 的文件中导入数据。
用作表达式的我的 UserVariable 是:*Report*.xlsx
它工作得很好。现在我正在尝试构建类似的循环,但仅限于文件名中不包含 Report 的文件。
类似于*<>Report*.xlsx
可能吗?
感谢帮助!
马特
在您的循环中,在您的第一个任务之前放置一个脚本任务。用一条线连接这两个。右键单击该行并将约束选项设置为表达式。你的表情应该是这样的...
FINDSTRING(@var, "Report", 1) == 0
@var 是可迭代的循环。
只有里面没有"Report"的文件才会进行下一步。
引用这个确切的答案。 SSIS Exclude certain files in Foreach Loop Container
不幸的是,您无法使用 SSIS 表达式(类似于 *[^...]*.xlsx
)实现此目的,您必须寻找一些解决方法:
解决方法
第一
在进入循环之前使用 Execute Script Task
获取过滤后的文件列表,然后使用 ForEach 循环容器(Ado 枚举器)进行循环
- 您必须使用类型
System.Object
(范围:包)[=95] 的 SSIS 变量 (例如:User::FilesList
) =] - 为每个循环容器添加一个
Execute Script Task
并添加User::FilesList
作为 ReadWrite 变量 在脚本中写入以下代码:
进口System.Linq 进口 System.IO 进口 System.Collections.Generic
Public Sub Main() Dim lstFiles As New List(Of String) lstFiles.AddRange(Directory.GetFiles("C:\Temp", "*.xlsx", SearchOption.TopDirectoryOnly).Where(Function(x) Not x.Contains("Report")).ToList) Dts.Variables.Item("FilesList").Value = lstFiles Dts.TaskResult = ScriptResults.Success End Sub
在 For each Loop Container 中选择枚举类型为 'From variable Enumerator' 并选择
FilesList
变量作为源
屏幕截图
第二
在 for each 循环中添加一个 Expression Task
来检查文件是否包含 Report
字符串
- 添加类型为
System.Boolean
的变量 (名称:ExcludeFile) - 在 ForEach 循环容器中,在导入 Excel 文件 的 DataFlowTask 之前添加一个
Expression Task
组件
在表达式任务中写入以下内容:
@[User::ExcludeFile] = (FINDSTRING(@[User::XlsxFile], "Report", 1 ) == 0)
双击表达式任务和 DataFlowTask 之间的连接器并写入以下表达式
@[User::ExcludeFile] == False
注意:不必使用 Expression Task
来验证这一点,您可以使用 Dummy DataFlowTask 或 脚本任务 检查文件名是否包含您要排除的关键字