Плоские файлы SSIS с переменными номерами столбцов

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

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

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

Кажется неоправданным иметь вариации в ширине файла по любой причине (конечно, только вариации в конце строки можно рационально обрабатывать (x меньше или дополнительных столбцов), но похоже, что это просто плохо обрабатывается, если я не пропущу что-то.

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

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

Ответы

Ответ 1

Гленн, я чувствую твою боль:) SSIS не может сделать столбцы динамическими, так как он должен хранить метаданные каждого столбца по мере его прохождения, и поскольку мы работаем с плоскими файлами, которые могут содержать любые данные, он не может предположить, что CRLF в столбце -that-is-not-that-last-column ', на самом деле это конец строки данных, которую он должен читать.

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

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

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

Информация о программном изменении пакета легко доступна.

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

Ответ 2

Я сталкиваюсь с теми же проблемами и хочу указать вам на проект CodePlex, который я нашел, который решает эти проблемы: http://ssisdfs.codeplex.com/