SSIS - существует ли компонент источника потока данных, который будет обрабатывать файлы CSV, где порядок столбцов может измениться? - PullRequest
1 голос
/ 28 января 2009

Мы написали несколько пакетов служб SSIS, которые импортируют данные из файлов CSV с использованием источника плоских файлов.

Теперь кажется, что после того, как эти пакеты развернуты в производство, поставщики этих файлов могут доставлять файлы, где изменяется порядок столбцов файлов (не спрашивайте!). В настоящее время, если это произойдет, наши пакеты потерпят неудачу.

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

Например. Используя тривиальный пример, исходный файл имеет следующее содержимое:

OurReference,Client,Amount
235,MFI,20000.00
236,MS,30000.00

Вывод из источника плоских файлов:

OurReference   Client   Amount
235            ClientA  20000.00
236            ClientB  30000.00

Впоследствии доставленный файл изменится на:

OurReference,ClientReference,Client,Amount
235,A244,ClientA,20000.00
236,B222,ClientB,30000.00

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

OurReference   Client   Amount
235            A244     ClientA,20000.00
236            B222     ClientB,30000.00

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

Любые предложения приветствуются!

Ответы [ 3 ]

1 голос
/ 28 января 2009

Не то, что я знаю.

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

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

Насколько я знаю, нет способа динамически добавлять столбцы в поток во время выполнения - поэтому все необходимые столбцы нужно будет добавить в вывод задачи скрипта. Могут ли они быть найдены и проанализированы с каждой строки, решать только вам. Любые «новые» (то есть непредвиденные) столбцы не могут быть использованы. Отсутствующие столбцы можно использовать по умолчанию или вызвать исключение.

Последняя возможность - использовать объектную модель служб SSIS для изменения пакета перед запуском, чтобы изменить диспетчер соединений, или даже для динамической записи всего пакета с использованием объектной модели на основе проверки входного файла. Я провел довольно много генерации пакетов в C # с использованием шаблонов и затем добавил информацию на основе метаданных, которые я получил из основных файлов, описывающих файлы мэйнфреймов.

1 голос
/ 28 января 2009

Наилучшим подходом было бы запустить проверку, прежде чем пакет служб SSIS импортирует данные CSV. Это может быть внешний скрипт / приложение, потому что я не думаю, что вы можете манипулировать данными в MS Business Intelligence Studio.

0 голосов
/ 02 февраля 2013

Вот грубый подход. Я запишу ограничения в конце. Создать источник плоского файла. Поместите весь ряд в один столбец. Не проверяйте имена столбцов в первой строке данных. Создать компонент скрипта Код:

public override void Input0_ProcessInputRow(Input0Buffer Row)
{
    string sRow = Row.Column0;

    string sManipulated = string.Empty;
    string temp = string.Empty;

    string[] columns = sRow.Split(',');

    foreach (string column in columns)
    {
       sManipulated = string.Format("{0}{1}", sManipulated, column.PadRight(15, ' '));
    }
    /* Note: For sake of demonstration I am padding to 15 chars.*/

    Row.Column0 = sManipulated; 
}

Создать место назначения плоского файла Отобразить столбец 0 в столбец 0

Ограничение: я произвольно дополнил каждое поле до 15 символов. Вопросы для рассмотрения: 1. Нужно ли иметь каждое поле одинакового размера? 2. Если да, то каков этот размер?

Общий способ обработки, который заключается в создании таблицы для хранения имени файла, полей и размеров полей. Используйте имя файла для динамического создания менеджера соединений источника и назначения. Используйте имя поля и соответствующий размер поля для определения заполнения. Не уверен, если вам нужна такая большая гибкость. Если у вас есть какие-либо вопросы, пожалуйста, ответьте.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...