Разделители нескольких строк

#ssis #delimiter

#ssis #разделитель

Вопрос:

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

Вежливость требуется всегда; грубость недопустима.

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

Вежливость требуется всегда

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

Комментарии:

1. Итак, у вас уже есть разделитель строк, определенный как символ новой строки (n), и вы хотите также разделить на точку с запятой? Есть ли только одна строка в потоке данных или вам нужно скопировать столбцы 1-n и удвоить для строки вежливости и строки грубости?

2. @arz вы имеете в виду использование ; и rn для разделителя строк?

Ответ №1:

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

 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 как строку 8000. YMMV

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

поток данных

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

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

Перевод сценария в асинхронный режим

В ваших выходных столбцах для OutputSplit добавьте столбец с именем SplitRow DT_STR 8000. определение выходного столбца

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

 /// <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 и вуаля,
Просмотр данных

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

Комментарии:

1. Обновлено еще одним вопросом о макете файла. 2 или 3 разделителя?

2. Количество разделителей не является константой и может составлять 2,3 или более 3.

3. Возможно ли это без использования компонента Script?