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

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

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

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

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

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

Мэтт


person Mateusz Konopelski    schedule 06.03.2017    source источник
comment
Дублирующий вопрос. Это работает. Только что попробовал. stackoverflow.com/ вопросы/19093008/   -  person manderson    schedule 06.03.2017
comment
@manderson это не дубликат. Это какой-то обходной путь   -  person Hadi    schedule 06.03.2017
comment
Я сказал дубликат, потому что ответ тот же. Я не хотел в основном копировать этот ответ в этот вопрос, но, поскольку это не дубликат... Я вставил ответ для пользователя.   -  person manderson    schedule 06.03.2017
comment
ОП спрашивал, может ли он добиться этого с помощью выражений. Мое замечание касалось слова duplicate, а не всего комментария. Ссылка, которую вы предоставили, полезна для этого случая.   -  person Hadi    schedule 06.03.2017


Ответы (2)


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

Временные решения

Первый

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

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

Скриншоты

введите здесь описание изображения

введите здесь описание изображения

введите здесь описание изображения

Второй

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

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

введите здесь описание изображения

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

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

введите здесь описание изображения

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

    @[User::ExcludeFile] == False
    

введите здесь описание изображения

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

person Hadi    schedule 06.03.2017

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

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

Где @var — итерируемый цикл.

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

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

person manderson    schedule 06.03.2017