2010-11-25 5 views
14

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

  1. Если кто-то поставляет файл с 11-го столбца в любом месте, было бы неплохо, если бы SSIS просто игнорировали его, так как вы не определили его. Он должен просто прочитать 10 столбцов, которые вы определили, а затем пропустить до конца маркера строки, но вместо этого он объединяет любые дополнительные данные с данными в 10-м столбце и вставляет все это в 10-й столбец. На самом деле бесполезно. Я понимаю, что это происходит, потому что разделитель для 10-го столбца не является вкладкой, как все остальные, но CRLF, поэтому он просто захватывает все до CRLF, заменяя лишние вкладки ничем, поскольку это так. На мой взгляд, это не умно.

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

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

До сих пор наше единственное решение - загрузить строку как один гигантский столбец (столбец0), а затем использовать задачу сценария для динамического разделения, используя, однако, множество разделителей Это работает хорошо, за исключением того, что ограничивает ширину строки до 4000 символов (максимальная ширина одного столбца Юникода) .Если вам нужно импортировать более широкую строку (скажем, с несколькими столбцами шириной 4000 для импорта текста), вам необходимо определить несколько столбцы как abo ve, но вы застряли с требованием строгого количества столбцов в строке.

Есть ли какой-либо путь вокруг этих ограничений?

ответ

12

Гленн, я чувствую вашу боль :) SSIS не может делать столбцы динамическими, так как он должен хранить метаданные каждого столбца по мере его прохождения, а так как мы работаем с плоскими файлами, которые могут содержать любые данные , он не может предположить, что CRLF в столбце «тот, кто не является последним», действительно является концом строки данных, которую он должен читать.

В отличие от DTS в SQL2000, вы не можете изменить свойства пакета SSIS во время выполнения.

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

Затем родительский пакет программным образом загружает дочерний пакет (задача сценария) и обновляет метаданные исходного соединения дочернего пакета. Здесь вы должны либо 1. Добавить/удалить столбцы в соответствии с плоским файлом. 2. Установите разделитель столбцов для столбцов, последний столбец должен быть CRLF - соответствующий разделитель ROW 3. Повторите инициализацию метаданных (ComponentMetadata.ReinitializeMetadata()) источника Compoenent в задаче потока данных (чтобы узнать недавнее изменения в исходном соединении). 4. Сохраните пакет sys для детей.

Сведения о программном изменении пакета доступны только для ознакомления.

Затем ваш родительский пакет просто выполняет пакет Child (Выполнение задачи пакета), и он будет выполняться с вашими новыми сопоставлениями.

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