Подстановочные знаки в коллекции служб SSIS {не включают} имя xlsx
У меня есть процесс, встроенный в SSIS, который проходит по файлам Excel и импортирует данные только из тех, которые включают в себя имя Report.
Моя переменная пользователя, используемая в качестве выражения: *Report*.xlsx
и это прекрасно работает. Сейчас я пытаюсь создать аналогичный цикл, но только для файлов, которые НЕ включают отчет в имя файла.
Что-то вроде *<>Report*.xlsx
Является ли это возможным?
Спасибо за помощь!
Matt
2 ответа
К сожалению, вы не можете достичь этого с помощью выражения SSIS (что-то вроде *[^...]*.xlsx
) вам нужно искать обходные пути:
обходные
Первый
Получить список - отфильтрованных - файлов, используя Execute Script Task
перед входом в Loop и loop, затем с помощью контейнера ForEach Loop (Ado enumerator)
- Вы должны переменную SSIS (например:
User::FilesList
) с типомSystem.Object
(Область применения: пакет) - Добавить
Execute Script Task
перед для каждого контейнера Loop и добавитьUser::FilesList
как переменная ReadWrite В сценарии напишите следующий код:
Импортирует System.Linq Импортирует System.IO Импортирует System.Collections.Generic
Public Sub Main() Dim lstFiles As New List(Of String) lstFiles.AddRange(Directory.GetFiles("C:\Temp", "*.xlsx", SearchOption.TopDirectoryOnly).Where(Function(x) Not x.Contains("Report")).ToList) Dts.Variables.Item("FilesList").Value = lstFiles Dts.TaskResult = ScriptResults.Success End Sub
В поле "Для каждого контейнера цикла" выберите тип Enumertaion как "Из переменного перечислителя" и выберите
FilesList
переменная как источник
ScreenShots
второй
Внутри каждого цикла добавьте Expression Task
проверить, содержит ли файл Report
строка или нет
- Добавить переменную типа
System.Boolean
(Имя: ExcludeFile) - Внутри ForEach Loop Container добавьте
Expression Task
Компонент перед DataFlowTask вы, который импортирует файл Excel
Внутри Expression Task напишите следующее:
@[User::ExcludeFile] = (FINDSTRING(@[User::XlsxFile], "Report", 1 ) == 0)
Дважды щелкните соединитель между задачей выражения и DataFlowTask и напишите следующее выражение
@[User::ExcludeFile] == False
Примечание: нет необходимости использовать Expression Task
чтобы проверить это, вы можете использовать Dummy DataFlowTask или задачу скрипта, чтобы проверить, содержит ли имя файла ключевое слово, которое вы хотите исключить или нет
В своем цикле поместите задачу "Сценарий" перед своей первой задачей. Соедините эти два с линией. Щелкните правой кнопкой мыши по этой строке и задайте для параметров ограничения выражение. Ваше выражение будет выглядеть так...
FINDSTRING(@var, "Report", 1) == 0
Где @var - это повторяемый цикл.
Только файлы без "Report" внутри перейдут к следующему шагу.
Ссылка на этот точный ответ. SSIS Исключить определенные файлы в контейнере циклов Foreach