2009-01-28 5 views
1

Мы написали несколько пакетов SSIS, которые импортируют данные из CSV-файлов с использованием Flat File Source.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 

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

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

ответ

1

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

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

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

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

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

+0

Большое спасибо Cade - ваши комментарии очень полезны! –

1

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

0

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

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; 
} 

Создать плоский файл назначения Карта column0 в column0

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

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

 Смежные вопросы

  • Нет связанных вопросов^_^