我有一个包通过一个文件夹和它的子文件夹来获取客户端数据。协议已更改,现在客户端每次都会以不同的文件夹名称发布数据。我想知道我是否可以在主文件夹上执行foreach循环并排除archive
之类的特定文件夹。
我没有编写脚本的知识,所以我想知道SSIS是否可以在没有脚本的情况下做到这一点。
答案 0 :(得分:3)
使用Execute Script Task
获取 - 过滤 - 文件列表,然后进入循环并循环然后使用ForEach循环容器(Ado枚举器)
User::FilesList
的SSIS变量(例如:System.Object
)(范围:包) Execute Script Task
,并将User::FilesList
添加为 ReadWrite Variable 在脚本中编写以下代码:
Imports System.Linq
Imports System.IO
Imports System.Collections.Generic
Public Sub Main()
Dim Directory as String = "C\Temp"
Dim strSubDirectory as String = Directory & "\New Folder"
Dim lstFiles As New List(Of String)
lstFiles.AddRange(Directory.GetFiles(Directory, "*.*", SearchOption.TopDirectoryOnly).Where(Function(x) Not x.Contains(strSubDirectory)).ToList)
Dts.Variables.Item("FilesList").Value = lstFiles
Dts.TaskResult = ScriptResults.Success
End Sub
在For Each Loop Container中选择Enumertaion Type为From variable Enumerator
并选择FilesList
变量作为来源
<强>截图强>
有关详细信息,请参阅以下链接中的答案(类似情况)WildCards in SSIS Collection {not include} name xlsx
答案 1 :(得分:1)
如果您使用脚本任务
,您可能会有更多控制权以下是我在SSIS中使用的示例代码:
// Fetch Exclude Directory list from Table
List<excludeDir> excludeDir = new List<excludeDir>();
SqlConnection conn = new SqlConnection(@"Data Source=.\SQLEXPRESS;AttachDbFilename=C:\testDB.mdf;Integrated Security=True;User Instance=True");
SqlCommand cmd = new SqlCommand("select DirList from excludeDir", conn);
SqlDataReader dr;
try
{
conn.Open();
dr = cmd.ExecuteReader();
while (dr.Read())
{
excludeDir.Add(new excludeDir()
{
Dir = dr.GetInt32(dr.GetOrdinal("DirList")),
});
}
dr.Close();
}
catch (Exception exp)
{
throw;
}
finally
{
conn.Close();
}
// compare against Sub directory list and process
string[] dirs = Directory.GetDirectories(@"C:\My Sample Path\");
string[] fileExclude = excludeDir ;
foreach (string path in dirs)
{
FileInfo f = new FileInfo(item2);
listBox1.Items.Add(f.Name);
for (int i = 0; i < fileExclude.Length; i++)
{
-- Console.WriteLine(fileArray[i]);
IF dirs [i] == fileExclude [i]
{
//Set Flags accordingly and execute
}
}
}
答案 2 :(得分:0)
您不能在foreach循环属性中执行此操作,但您可以执行的操作是使用脚本任务启动循环内的任务,该任务检查文件夹名称是否是您要排除的值,以及它只是循环到下一个文件夹。
答案 3 :(得分:0)
我会通过使用表达式在For Each循环容器中的Tasks上设置Disable属性来实现此目的(没有脚本任务),例如
FINDSTRING ( @[User::Each_File_Path] , "archive" , 1 ) > 0