【问题标题】:Exclude specific Sub Folders排除特定的子文件夹
【发布时间】:2017-04-07 16:40:10
【问题描述】:

我有一个通过文件夹运行的包,它是用于获取客户端数据的子文件夹。协议已经改变,现在客户每次都会将他的数据发布在不同的文件夹名称中。我想知道是否可以在主文件夹上执行 foreach 循环并排除特定文件夹,例如 archive

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

【问题讨论】:

  • 客户端创建的文件夹是否有任何命名约定(如 folder_Name_Date)?
  • 是否可以让您系统的用户维护要包含或排除的文件夹列表?允许的文件夹列表会更安全、更容易保护。如果你能做到这一点,只需为存储过程添加一个数据源。

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


【解决方案1】:

使用执行脚本任务

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

  1. 您必须使用类型为 System.Object 的 SSIS 变量 (例如:User::FilesList (范围:包)
  2. 在 for 每个循环容器之前添加 Execute Script Task 并将 User::FilesList 添加为 ReadWrite 变量
  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 变量作为源

屏幕截图

使用表达式任务

更多细节可以参考我在下面的链接中的回答(也是类似情况)WildCards in SSIS Collection {not include} name xlsx

【讨论】:

    【解决方案2】:

    如果你使用脚本任务,你可能有更多的控制权

    这是我在其中一个 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 
               }
           }
    
        }
    

    【讨论】:

      【解决方案3】:

      您不能在 foreach 循环属性中执行此操作,但您可以使用脚本任务启动循环内的任务,该任务检查文件夹名称是否是您要排除的值,如果是的,除了循环到下一个文件夹之外什么都不做。

      【讨论】:

        【解决方案4】:

        我将通过使用表达式在 For Each 循环容器内的任务上设置 Disable 属性来实现这一点(没有脚本任务),例如

        FINDSTRING ( @[User::Each_File_Path] , "archive" , 1 ) > 0
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2015-12-11
          • 2012-11-19
          • 1970-01-01
          • 2013-03-22
          • 2014-02-09
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多