Плоские файлы служб SSIS с переменными номерами столбцов - PullRequest
14 голосов
/ 26 ноября 2010

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

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

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

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

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

Есть ли способ обойти эти ограничения

1 Ответ

12 голосов
/ 29 ноября 2010

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

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

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

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

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

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

...