Подстановочные знаки в коллекции служб SSIS {не включают} имя xlsx

У меня есть процесс, встроенный в SSIS, который проходит по файлам Excel и импортирует данные только из тех, которые включают в себя имя Report.

Моя переменная пользователя, используемая в качестве выражения: *Report*.xlsxи это прекрасно работает. Сейчас я пытаюсь создать аналогичный цикл, но только для файлов, которые НЕ включают отчет в имя файла.

Что-то вроде *<>Report*.xlsx

Является ли это возможным?

Спасибо за помощь!

Matt

2 ответа

Решение

К сожалению, вы не можете достичь этого с помощью выражения SSIS (что-то вроде *[^...]*.xlsx) вам нужно искать обходные пути:

обходные

Первый

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

  1. Вы должны переменную SSIS (например: User::FilesList ) с типом System.Object (Область применения: пакет)
  2. Добавить Execute Script Task перед для каждого контейнера Loop и добавить User::FilesList как переменная ReadWrite
  3. В сценарии напишите следующий код:

    Импортирует 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
    
  4. В поле "Для каждого контейнера цикла" выберите тип Enumertaion как "Из переменного перечислителя" и выберите FilesList переменная как источник

ScreenShots

второй

Внутри каждого цикла добавьте Expression Task проверить, содержит ли файл Report строка или нет

  1. Добавить переменную типа System.Boolean (Имя: ExcludeFile)
  2. Внутри ForEach Loop Container добавьте Expression Task Компонент перед DataFlowTask вы, который импортирует файл Excel

  1. Внутри Expression Task напишите следующее:

     @[User::ExcludeFile]  = (FINDSTRING(@[User::XlsxFile], "Report", 1 ) == 0)
    

  1. Дважды щелкните соединитель между задачей выражения и DataFlowTask и напишите следующее выражение

    @[User::ExcludeFile] == False
    

Примечание: нет необходимости использовать Expression Task чтобы проверить это, вы можете использовать Dummy DataFlowTask или задачу скрипта, чтобы проверить, содержит ли имя файла ключевое слово, которое вы хотите исключить или нет

В своем цикле поместите задачу "Сценарий" перед своей первой задачей. Соедините эти два с линией. Щелкните правой кнопкой мыши по этой строке и задайте для параметров ограничения выражение. Ваше выражение будет выглядеть так...

FINDSTRING(@var, "Report", 1) == 0

Где @var - это повторяемый цикл.

Только файлы без "Report" внутри перейдут к следующему шагу.

Ссылка на этот точный ответ. SSIS Исключить определенные файлы в контейнере циклов Foreach

Другие вопросы по тегам