Вопрос по ssis, c# – SSIS - Как загрузить данные из текстовых файлов, где путь к файлам находится внутри другого текстового файла?

2

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

Список содержит две колонки:

<code>FilePath,Type
c:\f1.txt,A
c:\f2.txt,B
c:\f3.txt,B
</code>

Я хочу предоставить этот файл в качестве источника для служб SSIS. Затем я хочу, чтобы он проходил по каждой строке. Для каждой строки я хочу прочитать файл в столбце FilePath и проверить тип.

Если тип A, то я хочу, чтобы он игнорировал первые 4 строки файла, расположенного в столбце FilePath текущей строки, а затем загружал оставшиеся данные внутри этого файла в таблицу. Если тип B, то я хочу, чтобы он открыл файл и скопировал первый столбец файла в таблицу 1, а второй столбец - в таблицу 2 для всех строк.

Я был бы очень признателен, если бы кто-нибудь мог предоставить мне список шагов высокого уровня, которым я должен следовать.

Любая помощь приветствуется.

Ваш Ответ

3   ответа
1

узки файлов, которую вы собираетесь выполнять. Вы можете выполнить эти пакеты из другой программы, смотрите здесь:Как выполнить пакет служб SSIS из .NET?

Учитывая эту информацию, вы можете написать быструю программу для выполнения соответствующих пакетов:

var jobs = File.ReadLines("C:\\temp\\order.txt")
               .Skip(1)
               .Select(line => line.Split(','))
               .Select(tokens => new { File = tokens[0], Category = tokens[1] });

foreach (var job in jobs)
{
    // execute the relevant package for job.Category using job.File
}
1

айлами для обработки исходных файлов. КМ А будет обращаться к формату файла с пропуском первых 4 строк, В звучит так, как будто это просто файл с 2 столбцами и т. Д. Последний КМ будет использоваться для анализа командного файла, который вы иллюстрировали.

Теперь, когда у вас есть все эти менеджеры соединений, вы можете приступить к логике обработки.

Создайте 3 переменные. 2 типа строка (CurrentPath, CurrentType). 1 имеет тип Object, и я назвал его Recordset.

enter image description here

Первый поток данных считывает все строки из источника плоских файлов, используя «CM Control». Это данные, которые вы указали в своем примере.

Затем мы будем использовать этот объект Recordset в качестве источника для контейнера цикла ForEach в том, что обычно называют уничтожением. Свяжите термин «Shred recordset ssis» и вы обязаны просмотреть ряд статей, описывающих, как это сделать. Конечным результатом является то, что для каждой строки в этом исходном управляющем файле CM вы будете назначать эти значения в переменные CurrentPath, CurrentType.

Внутри этого контейнера Loop создайте центральную точку для контроля, чтобы контроль излучался. Я считаю, что задача сценария прекрасно работает для этого. Перетащите его на холст, дайте ему строгое имя, чтобы указать, что он ни для чего не используется, а затем создайте поток данных для обработки каждой перестановки обработки.

Магия исходит от использования выражений. У Dang почти во всем в SSIS могут быть заданы выражения для их свойств, что отличает профессионалов от позеров. Здесь мы дважды щелкнем по строке, соединяющей данный поток данных, и изменим тип ограничения с & quot; Constraint & quot; на "Выражение и ограничение" Выражение, которое вы бы затем использовали, является чем-то вроде@[User::CurrentType] == "A" Это гарантирует, что путь будет выбран только тогда, когда родительская задача выполнена успешно и условие выполнено.

Второй бит магии выражения будет применен к самим менеджерам соединений. Им нужно, чтобы их свойство ConnectionString определялось значением@[User::CurrentFile] имущество. Это позволит значение времени разработкиC:\filea.txt но позволят значению времени выполнения из управляющего файла\\network\share\ClientFileA.txt Если все файлы не имеют одинаковую структуру, вам, скорее всего, потребуется установить DelayValidation в значение True в свойствах. В противном случае службы SSIS не пройдут предварительную проверку, как все «CM A». до "CM N"; будет использовать эту переменную CurrentFile, которая может быть или не быть допустимой строкой подключения для этого макета файла.

4

нию кSSIS 2008 R2.

Create an SSIS package and create three package variables namely FileName, FilesToRead and Type. FilesToRead variable will hold the list of files and their types information. We will have a loop that will go through each of those records and store the information in FileName and Type variables every time it loops through.

Variables

On the control flow tab, place a Data flow task followed by a ForEach Loop container. The data flow task would read the file containing the list of files that has to be processed. The loop would then go through each file. Your control flow tab would finally look something like this. For now, there will be errors because nothing is configured. We will get to that shortly.

control flow

On the connection manager section, you need four connections. First, you need an OLE DB connection to connect to the database. Name this as SQLServer. Second, a flat file connection manager to read the file that contains the list of files and types. This flat file connection manager will contain two columns configured namely FileName and Type Name this as Files. Third, another flat file connection manager to read all files of type A. Name this as Type_A. In this flat file connection manager, enter the value 4 in the text box Header rows to skip so that the first four rows are always skipped. Fourth, one more flat file connection manager to read all files of type B. Name this as Type_B.

connections

Let's get back to control flow. Double-click on the first data flow task. Inside the data flow task, place a flat file source that would read all the files using the connection manager Files and then place a Recordset Destination. Configure the variable FilesToRead in the recordset destination. Your first data flow task would like as shown below.

Data flow task

Now, let's go back to control flow tab again. Configure the ForEach loop as shown below. This loop will go through the recordset stored in the variable FilesToRead. Since, the recordset contains two columns, each time a record is looped through, the variables FileName and Type will be assigned the value of the current record.

for each collection

for each variable

Inside, the for each loop container, there are two data flow tasks namely Type A files and Type B files. You can configure each of these data flow tasks according to your requirements to read the files from connection managers. However, we need to disable the tasks based on the file that is being read., Type A files data flow task should be enabled only when A type files are being processed. Similarly, Type B files data flow task should be enabled only when B type files are being processed. To achieve this, click on the Type A files data flow task and press F4 to bring the properties. Click on the Ellipsis button available on the Expression property. On the Property Expressions Editor, select Disable Property and enter the expression !(@[User::Type] == "A")

Expression A

Similarly, click on the Type B files data flow task and press F4 to bring the properties. Click on the Ellipsis button available on the Expression property. On the Property Expressions Editor, select Disable Property and enter the expression !(@[User::Type] == "B")

Expression B

Here is a sample Files.txt containing only A type file in the list. When the package is executed to read this file, you will notice that only the Type A files data flow task.

sample file a

sample execution a

Here is another sample Files.txt containing only B type files in the list. When the package is executed to read this file, you will notice that only the Type B files data flow task.

sample file b

sample execution b

If Files.txt contains both A and B type files, the loop will execute the appropriate data flow task based on the type of file that is being processed. Configuring Data Flow task Type A files Let's assume that your flat files of type A have three column layout like as shown below with comma separated values. The file data here is shown using Notepad++ with all special characters. CR LF denotes that the lines are ending with Carriage return and Line Feed. This file is stored in the path C:\f1.txt

type a file

We need a table in the database to import the data. Let's create a table named dbo.Table_A in the SQL Server database as shown here.

Table

Now, go to the SSIS package. Here are the details to configure the Flat File connection manager named Type_A. Give a name to the connection manager. You need specify the value 4 in the Header rows to skip textbox. Your flat file connection manager should look something like this.

flat file general

flat file columns

On the Advanced tab, you can rename the column names if you would like to.

flat file advanced

Now that the connection manager is configured, we need to configure data flow task Type A files to process the corresponding files. Double-click on the data flow task Type A files. Place a Flat file source and OLE DB Destination inside the task.

data flow task

The flat file source has to be configured to read the files from flat file connection manager.

flat file source connection

flat file source columns

The data flow task doesn't do anything special. It simply reads the flat files of type A and inserts the data into the table dbo.Table_A. Now, we need to configure the OLE DB Destination to insert the data into database. The column names configured in the flat file connection manager and the table are not same. So, they have to be mapped manually.

ole db destination connection

ole db destination columns

Now, that the data flow task is configured. We have to make that the file path being read from the Files.txt is passed correctly. To do this, click on the Type_A flat file connection manager and press F4 to bring the properties. Set the DelayValidation property to True. Click on the Ellipsis button on the Expressions property.

Properties

On the Property Expression builder, select ConnectionString property and set it to the Expression @[User::FileName]

Expression

Here is a sample Files.txt file containing Type A files only.

files

Here are the sample type A files f01.txt and f02.txt

f01

f02

After the package execution, following data will be found in the table Table_A

table data

Above mentioned configuration steps have to be followed for Type B files. However, the data flow task would look slightly different since the file processing logic is different. Data flow task Type B files would something like this. Since you have to insert the two columns in type B files into different tables. You have to use Multicast transformation that would create clones of the input data. You could use each of the multicast output to pass through to a different transformation or destination.

data flow task type b

Надеюсь, что это поможет вам достичь своей цели.

Что будет внутри задачи потока данных файлов типа A? InfoLearner
Благодарю. Что, если я захочу скопировать первые две строки файла типа B в таблице 1, из строки 3 в строку 8 - & gt; данные в столбце 1 в таблицу 2 и столбце 2 в таблице 3, а для остальных строк введите данные в таблицу 4 InfoLearner
Единственное, что я хотел бы добавить, - это настроить источники данных на основе фактического столбца filepath в источнике данных / наборе записей. Подробный ответ как всегда +1

Похожие вопросы