Непревзойденная обработка файлов через контейнер ForEach Loop - PullRequest
0 голосов
/ 01 февраля 2019

В моей Исходной папке есть несколько обработанных и необработанных файлов, а имена всех обработанных файлов хранятся в таблице.Как я могу сопоставить имена файлов исходной папки и таблицы до ForEach Loop Container и обрабатывать только несопоставленные файлы.

Ответы [ 2 ]

0 голосов
/ 04 февраля 2019

Перед циклом Foreach используйте задачу «Сценарий», чтобы сохранить имена необработанных файлов в переменной объекта SSIS, а затем выполните итерацию по этой переменной, чтобы загрузить новые файлы такими, какие вы уже есть.Создайте переменную объекта и добавьте ее в поле ReadWriteVariables Задачи сценария.Если вы используете переменную SSIS для хранения пути к папке с исходными файлами, как это сделано ниже, добавьте это в поле ReadOnlyVariables.Циклу Foreach необходимо будет использовать тип перечислителя Foreach From Variable Enumerator .В поле «Переменная» на странице «Коллекция» добавьте переменную объекта, которая заполняется в задаче «Сценарий».Как вы, вероятно, уже делаете, добавьте строковую переменную в индекс 0 панели сопоставления переменных и задайте эту переменную как выражение свойства ConnectionString в диспетчере соединений, предполагая, что это соединение с плоским файлом.Если это Excel, измените свойство ExcelFilePath, чтобы использовать эту переменную в качестве выражения.Пример кода и ссылочные пространства имен для задачи «Сценарий» приведены ниже и используют C #.

using System.Linq;
using System.Data.SqlClient;
using System.IO;
using System.Collections.Generic;
using System.Data;

string connString = @"Data Source=YourSQLServer;Initial Catalog=YourDatabase;Integrated Security=SSPI;";
string cmdText = @"SELECT DISTINCT ColumnWithFileNames FROM YourDatabase.YourSchema.YourTable";

string sourceFolder = Dts.Variables["User::SourceFilePath"].Value.ToString();

//create DirectoryInfo object from source folder
DirectoryInfo di = new DirectoryInfo(sourceFolder);
List<string> processedFiles = new List<string>();

List<string> newFiles = new List<string>();


//get names of already processed files stored in tavle
using (SqlConnection conn = new SqlConnection(connString))
{
    conn.Open();
    //data set name does not need to relate to name of table storing processed files
    DataSet ds = new DataSet("ProcessedFiles");
    SqlDataAdapter da = new SqlDataAdapter(cmdText, conn);
    da.Fill(ds, "ProcessedFiles");

    foreach (DataRow dr in ds.Tables["ProcessedFiles"].Rows)
    {
        processedFiles.Add(dr[0].ToString());
    }

}

foreach (FileInfo fi in di.EnumerateFiles())
{
    //only add files not already processed
    if (!processedFiles.Contains(fi.FullName))
    {
        newFiles.Add(fi.FullName);
    }
}

//populate SSIS object variable with unprocessed files
Dts.Variables["User::ObjVar"].Value = newFiles.ToList();
0 голосов
/ 01 февраля 2019

Приведенное ниже решение немного сложнее, но это лучшее, что я мог придумать.

ШАГ 1: Создать 2 переменные, обе строки.

      a)CurrentFile: This will be used for your Foreach Loop Container collection value
      b)ToProcess: This will be used to map the result set an Execute SQL Task explained 
                 below

ШАГ 2: Добавить ExecuteЗадача SQL в контейнере цикла по каждому элементу.

Настройте сопоставление параметров, как показано ниже:

enter image description here

Используйте приведенный ниже скрипт в качестве оператора SQL:

DECLARE @ToProcess VARCHAR(1)

IF NOT EXISTS(SELECT [FileNames] FROM [YourFilesTable] WHERE FileNames = ?)

SET @ToProcess = 'Y'

SELECT @ToProcess AS ToProcess

Установите для ResultSet значение Single Row, как показано ниже:

enter image description here

Настройте набор результатов, как показано ниже:

enter image description here

В задаче «Выполнение SQL» настройте ограничение приоритета, как показано ниже:

enter image description here

Контейнер цикла по каждому элементу должен выглядеть следующим образом:

enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...