Многострочные разделители - PullRequest
       24

Многострочные разделители

1 голос
/ 31 октября 2011

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

Цивилизация требуется всегда; Грубость не потерпит.

Я хочу получить эти две строки после использования ';' и '.' для разделителя строк:

Цивилизация требуется всегда

грубость не потерпит

1 Ответ

3 голосов
/ 31 октября 2011

Для исходных данных я создал трехстрочный файл

Civility is required at all times; rudeness will not be tolerated.
The quick brown fox jumped over the lazy dogs.
I am but a single row with no delimiter beyond the carriage return

Общий подход, который я выбрал ниже, заключается в использовании диспетчера соединений с плоскими файлами в формате Ragged Right, а мой разделитель строк заголовка - {CR} {LF}. Я определил один столбец, InputRow как String 8000. YMMV

В моем потоке данных после источника плоских файлов я добавляю компонент сценария в качестве преобразования данных, называемого разделенными строками.

data flow

На вкладке «Столбцы ввода» отметьте InputRow и оставьте его как ReadOnly, чтобы скрипт мог получить доступ к значению. Было бы неплохо, если бы вы могли переключить его на ReadWrite и изменить исходящие значения, но это не применимо для этого типа операции.

По умолчанию задача скрипта является синхронным компонентом, то есть существует соотношение 1: 1 между строками и рядами. Это не будет соответствовать вашим потребностям, поэтому вам нужно будет переключить его в асинхронный режим. Я переименовал Output 0 в OutputSplit и изменил значение SynchronousInput с «Input 0 (16)» на None. Ваше значение для 16 может варьироваться.

Script to Async mode

В столбцах вывода для OutputSplit добавьте столбец с именем SplitRow DT_STR 8000. output column definition

В рамках вашего преобразования скрипта вам нужно иметь дело только с методом ProcessInputRow. Класс string предлагает метод split, который принимает массив значений символов, которые будут работать как разделители. В настоящее время он жестко запрограммирован ниже в инициализаторе массива, но его также легко можно определить как переменную и передать в скрипт. Это оставлено в качестве упражнения для плаката.

/// <summary>
/// we have to make this an async script as 1 input row can be many output rows
/// </summary>
/// <param name="Row"></param>
public override void Input0_ProcessInputRow(Input0Buffer Row)
{
    string[] results = Row.InputRow.Split(new char[]{';', '.'});
    foreach (string line in results)
    {
        // Remove this line if it is desirable to have empty strings in the buffer
        if (!string.IsNullOrEmpty(line))
        {
            OutputSplitBuffer.AddRow();
            // You might want to call trim operations on the line
            OutputSplitBuffer.SplitRow = line;
        }
    }
}

После всего этого я нажал F5 и вуаля, Data viewer

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

...