Для исходных данных я создал трехстрочный файл
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
В моем потоке данных после источника плоских файлов я добавляю компонент сценария в качестве преобразования данных, называемого разделенными строками.
На вкладке «Столбцы ввода» отметьте InputRow и оставьте его как ReadOnly, чтобы скрипт мог получить доступ к значению. Было бы неплохо, если бы вы могли переключить его на ReadWrite и изменить исходящие значения, но это не применимо для этого типа операции.
По умолчанию задача скрипта является синхронным компонентом, то есть существует соотношение 1: 1 между строками и рядами. Это не будет соответствовать вашим потребностям, поэтому вам нужно будет переключить его в асинхронный режим. Я переименовал Output 0 в OutputSplit и изменил значение SynchronousInput с «Input 0 (16)» на None. Ваше значение для 16 может варьироваться.
В столбцах вывода для OutputSplit добавьте столбец с именем SplitRow DT_STR 8000.
В рамках вашего преобразования скрипта вам нужно иметь дело только с методом 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 и вуаля,
Это будет довольно трудоемкий пакет, в зависимости от того, сколько данных вы используете. Я уверен, что есть оптимизация, которую можно сделать, но этого должно быть достаточно, чтобы вы начали.