排除特定的子文件夹

时间:2017-04-07 16:40:10

标签: sql-server ssis etl ssis-2012 foreach-loop-container

我有一个包通过一个文件夹和它的子文件夹来获取客户端数据。协议已更改,现在客户端每次都会以不同的文件夹名称发布数据。我想知道我是否可以在主文件夹上执行foreach循环并排除archive之类的特定文件夹。

我没有编写脚本的知识,所以我想知道SSIS是否可以在没有脚本的情况下做到这一点。

4 个答案:

答案 0 :(得分:3)

使用执行脚本任务

使用Execute Script Task获取 - 过滤 - 文件列表,然后进入循环并循环然后使用ForEach循环容器(Ado枚举器)

  1. 您需要一个类型为User::FilesList 的SSIS变量(例如:System.Object(范围:包)
  2. 在每个循环容器之前添加Execute Script Task,并将User::FilesList添加为 ReadWrite Variable
  3. 在脚本中编写以下代码:

    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
    
  4. 在For Each Loop Container中选择Enumertaion Type为From variable Enumerator并选择FilesList变量作为来源

  5. <强>截图

    enter image description here

    enter image description here

    enter image description here

    使用表达式任务

    有关详细信息,请参阅以下链接中的答案(类似情况)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