Исключить определенные подпапки

Я получил пакет, который проходит через папку и ее подпапки для получения данных клиента. Соглашение изменилось, и теперь клиент будет каждый раз публиковать свои данные в разных именах папок. Мне было интересно, могу ли я сделать цикл foreach для основной папки и исключить определенные папки, такие как archive,

У меня нет знаний по написанию сценариев, поэтому мне было интересно, может ли SSIS сделать это без сценария.

4 ответа

Использование задачи "Выполнение скрипта"

Получить список - отфильтрованных - файлов, используя Execute Script Task перед входом в Loop и loop, затем с помощью контейнера ForEach Loop (Ado enumerator)

  1. Вы должны переменную SSIS (например: User::FilesList ) с типом System.Object (Область применения: пакет)
  2. Добавить Execute Script Task перед каждым контейнером Loop и добавить 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. В поле "Для каждого контейнера цикла" выберите тип Enumertaion как From variable Enumerator и выбрать FilesList переменная как источник

ScreenShots

Использование задачи выражения

Для получения более подробной информации вы можете обратиться к моему ответу по следующей ссылке (это аналогичный случай) WildCards в SSIS Collection {не включать} имя xlsx

У вас может быть больше контроля, если вы используете задачу Script

Вот пример кода, который я использовал в одном из 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 
           }
       }

    }

Вы не можете сделать это в свойствах цикла foreach, но вы можете запустить задачи внутри цикла с помощью задачи скрипта, которая проверяет, является ли имя папки значением, которое вы хотите исключить, и если это так, ничего не делать, кроме как перейти к следующей папке.

Я бы достиг этого (без задачи "Сценарий"), установив свойство Disable для задач внутри контейнера "Для каждого цикла" с помощью выражения, например:

FINDSTRING ( @[User::Each_File_Path] , "archive" , 1 ) > 0
Другие вопросы по тегам