Исключить определенные подпапки
Я получил пакет, который проходит через папку и ее подпапки для получения данных клиента. Соглашение изменилось, и теперь клиент будет каждый раз публиковать свои данные в разных именах папок. Мне было интересно, могу ли я сделать цикл foreach для основной папки и исключить определенные папки, такие как archive
,
У меня нет знаний по написанию сценариев, поэтому мне было интересно, может ли SSIS сделать это без сценария.
4 ответа
Использование задачи "Выполнение скрипта"
Получить список - отфильтрованных - файлов, используя Execute Script Task
перед входом в Loop и loop, затем с помощью контейнера ForEach Loop (Ado enumerator)
- Вы должны переменную SSIS (например:
User::FilesList
) с типомSystem.Object
(Область применения: пакет) - Добавить
Execute Script Task
перед каждым контейнером Loop и добавитьUser::FilesList
как переменная ReadWrite В сценарии напишите следующий код:
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
В поле "Для каждого контейнера цикла" выберите тип 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