Импорт данных Excel, кажется, случайным образом дает нулевые значения

Использование SSIS для Visual Studio 2017 для импорта некоторых файлов Excel.

Я создал пакет с несколькими контейнерами циклов, которые вызывают определенные пакеты для обработки некоторых файлов. У меня есть проблема с одним конкретным пакетом, который выполняется в том смысле, что он, по-видимому, случайным образом решает, что данные для столбцов равны NULL для каждого файла excel. У меня сложилось впечатление, что это часть параметра реестра для TypeGuessRows (сначала измененного на 0, а затем на 1000 в качестве теста), расположенного по адресу

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Office\14.0\Access Connectivity Engine\Engines\Excel

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

Глядя на исходные файлы, все они имеют один и тот же тип данных. Я попытался изменить значение реестра TypeGuessRows и убедиться, что свойство выходного столбца было строковым, а не числовым. Строка подключения имеет IMEX=1


person J. Sutton    schedule 29.05.2019    source источник


Ответы (2)


Поэтому я исправил это. Или, по крайней мере, нашел достаточное обходное решение, которое должно помочь любому в моей ситуации. Я думаю, что это связано с кешем служб SSIS. В итоге я поместил функцию сортировки в проблемный столбец, чтобы записи, считываемые как NULL для случайного типа данных, читались первыми и не считались случайными. Я скажу: Сначала я попробовал это, и это не сработало. Проведя небольшой эксперимент по созданию нового потока данных в том же пакете, я обнаружил, что это решение действительно работает, поэтому я думаю, что кеш была проблема. Если у кого-то есть дополнительные вопросы по этому поводу, дайте мне знать.

person J. Sutton    schedule 06.06.2019
comment
Я столкнулся с той же проблемой. Пожалуйста, предоставьте решение для подачи заявки. - person giparekh; 28.07.2020

Эта проблема связана с поставщиком OLEDB, используемым для чтения файлов Excel: поскольку Excel не является базой данных, в которой каждый столбец имеет определенный тип данных, поставщик OLEDB пытается определить доминирующие типы данных, найденные в каждом столбце, и заменить все другие типы данных, которые не могут быть проанализированы с помощью NULL.

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

Но после многолетнего использования SSIS я могу сказать, что лучше всего преобразовывать файлы Excel в файлы csv и читать их с помощью компонентов Flat File.

Или, если у вас нет выбора для преобразования excel в плоские файлы, вы можете заставить диспетчер соединений excel игнорировать заголовки из первой строки, добавив HDR=NO в строку подключения и добавив IMEX=1, чтобы указать поставщику OLEDB указать типы данных из первая строка (которая является заголовком - в большинстве случаев все строки), в этом случае все столбцы импортируются как строки, и никакие значения не заменяются на NULL, но вы потеряете заголовки и дополнительную строку (строка заголовка импортируется).

Если вы не можете игнорировать строку заголовка, просто добавьте фиктивную строку, содержащую фиктивные строковые значения (пример: aaa) после строки заголовка, и добавьте IMEX=1 к строке подключения.

Полезные ссылки

person Hadi    schedule 30.05.2019
comment
Эй, спасибо за ответ, но я не могу изменить исходные данные. HDR уже был установлен на НЕТ из-за несвязанной проблемы; Я не думал, что это будет иметь отношение к этой проблеме, поэтому я не упомянул об этом в посте. Кроме того, согласно исходному сообщению, IMEX = 1 уже установлен. Я прочитал пару ссылок, которые вы предоставили перед публикацией этого вопроса, и при чтении остальных кажется, что все они рекомендуют варианты IMEX = 1 и / или изменяют реестр, чтобы убедиться, что TypeGuessRows равен 0, а также проверку типов данных, о которых я уже упоминал в своем посте. - person J. Sutton; 30.05.2019