#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?