Быстрый ответ
Изменить запись реестра Windows с помощью RegEdit.В моей системе, Windows 10, x64, Office 2016, запись
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Office\14.0\Access Connectivity Engine\Engines\Excel\TypeGuessRow
изменится на
0
Объяснение
Proc IMPORT DBMS=EXCEL
выводит столбец var2
является числовым содержимым, поскольку он не отсканировал достаточно строк Excel, чтобы обнаружить, что имеется нечисловое содержимое.Таким образом, при этом выводе при достижении нечислового содержимого процедура заменяет его отсутствующим значением.
Вам придется
- Принудительно выполнить ИМПОРТ для сканирования достаточного количества строк, чтобы найти нечисловые значения.в столбце (если есть).
- Заставляет IMPORT определять эти столбцы (переменные) как символьный тип
- Постобработка импортированного набора данных на шаге DATA
- Выполняет преобразования, которыепреобразовать эти ожидаемые числовые переменные в фактическую числовую переменную.
Сканирование нескольких строк - Excel
Естьнет опции Proc IMPORT
для изменения количества сканируемых строк Excel.
Proc IMPORT DBMS=Excel
в Windows использует технологию Microsoft для чтения файлов Excel.В версии SAS <9.2 Phase 2 используется технология Jet, а в новых версиях используется ACE.Каждая из этих технологий использует реестр <strong>Windows для получения параметра TypeGuessingRows
, который указывает, сколько строк должно быть отсканировано, прежде чем выводить столбец из символов, чисел или даты.Когда значение параметра равно 0 , все строки сканируются перед выводом.
Документация SAS «Интерфейс SAS / ACCESS® 9.4 для файлов ПК: справка, четвертое издание»В главе «Файлы книг Microsoft Excel» подробно описана запись реестра Windows , которую необходимо изменить в зависимости от установки системы и Office.Как упоминалось в , в быстром моей системе установлено
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Office\14.0\Access Connectivity Engine\Engines\Excel\TypeGuessRow
Значение по умолчанию 8
строк было изменено на 0
.
Бонус: сканированиебольше строк - файлы с разделителями
Это будут текстовые файлы с полями, разделенными запятыми, символами табуляции или другими символами.
Proc IMPORT DBMS=CSV
можно принудительно просканировать все строки с помощьюGUESSINGROWS оператор
Proc IMPORT --all my options-- out=import_raw;
GUESSINGROWS=MAX; * statement;
run;
Шаг 2 - Постобработка
Вот пример кода, показывающий, как известный «хитрый» столбец преобразуется вчисловой столбец с таким же именем. правило заключается в том, что значение <####
будет преобразовано в ####
.
data import;
set import_raw (rename=var2=var2_raw);
if var2_raw =: '<' then
var2 = input(substr(var2_raw,2), best12.);
else
var2 = input(var2_raw,best12.);
drop var2_raw;
run;
Ваши действительные правила преобразования могут отличаться - например, вам может потребоваться добавить $1
столбец var2_relation
, который принимает значения =
, <
или >
.Или вы можете сжать значение, удалив все нечисловые символы, перед выполнением преобразования input ().
Другой вопрос, если у вас возникнут проблемы с кодированием решения, которое выполняет одинаковое преобразование для всех переменных.