импортировать переменные с символьными и числовыми значениями из Excel в SAS - PullRequest
0 голосов
/ 22 мая 2018

У меня есть набор данных в Excel, переменные содержат значения как в символьном, так и в числовом форматах.

var1 -------- var2

352,45 ----- <34,5 </p>

при их импортев SAS отсутствует var2, как я могу сохранить или приписать "<34,5" для var2? </p>

Я использую следующий код для импорта:

PROC IMPORT OUT= data
DATAFILE= "data1.xlsx" 
DBMS=EXCEL REPLACE;
RANGE="Sheet1$"; 
GETNAMES=YES;
MIXED=YES;
SCANTEXT=YES;
USEDATE=YES;
SCANTIME=YES;
RUN;

Ответы [ 3 ]

0 голосов
/ 22 мая 2018

Задумывались ли вы об использовании infile вместо proc import?Кроме того, если число и символы находятся в одном и том же столбце, вам нужно принудительно ввести его в символы.

http://www2.sas.com/proceedings/forum2008/166-2008.pdf

Приведенный ниже код является примером, который я получил из цикла, но вам следуетбыть в состоянии понять это.Обратите внимание, что когда в колонке infile указывается символ «$» после символа «$», это приводит к тому, что в колонке используются символы!

 filename file&i "&fdir";   /*THIS ASSIGN FILE NAME RELATED WITH THE DIRECTORY IN PREVIOUS FILE*/
      data &name; /*USE THE FULL PATH OF THE FILE NEEDED AS PER 1ST TABLE*/
LENGTH  BAN $10.;
    LENGTH  SUBSCRIBER_NO   $10.;
    LENGTH  TRANSACTION_DATE    $18.;
    LENGTH  OPT1    $18.;
        INFILE file&i delimiter = ',' MISSOVER DSD LRECL=32767 FIRSTOBS=2 flowover;
        input SUBSCRIBER_NO $   BAN $   OPT1 $  TRANSACTION_DATE $  TRANSACTION_TYPE $  ITEM_ID $   MSID $  NIN1 $  ACTIVATION_TYPE $   STORE_CODE $    OPT8 $  OPT10 $     OPT9 $  WES $   BILL_CYCLE $    LANGUAGE_CODE $     REGION $    COMPANY_CODE $  PRICE_PLAN $    COMMIT_START_DATE $     SYS_CREATION_DATE $     RENEWAL_DATE $  ESN_TYPE $  ACCOUNT_TYPE $  EFFECTIVE_DATE $    INIT_ACTIVATION_DATE $  TENURE $    DATA $  PRICE_PLAN_DATA $   OPT3 $  PRICE_PLAN_DESC $   MSF $   PRICE_PLAN_SERIES $     ACTIVATION_DATE $   OPT5 $  TERM_STATUS $   OPT4 $  FIRST_NAME $    LAST_BUSINESS_NAME $    ADDRESS_ATTENTION $     USER_NAME $     ADDRESS_NAME_1 $    ADDRESS_NAME_2 $    ADDRESS_NAME_3 $    CITY $  province $  POSTAL_CODE $   home_no $   work_no $   MKT_ACCOUNT_TYPE $  ESN_EFFECTIVE_DATE $    CABLE_FOOTPRINT $   COMMON_IND $    CS_VIP_CLASS $  OPT2 $  OPT6 $  OPT7 $  KEYCODE $   CAMPAIGN_CODE $     CAMPAIGN_CYCLE $    CAMPAIGN_DATE $     CAMPAIGN_DESCRIPTION $  CAMPAIGN_TYPE $     EMAIL $     MOP $   SERIAL_NUMBER $     ACTIVATION_SUB_TYPE $   SALES_REP $ ;
      run;

      data import;
        set %if ne 1 %then import;
            &name;
      run;
      %let i = %eval(&i+1);
      filename  file&i clear;  
0 голосов
/ 22 мая 2018

Как уже отмечали другие, вероятно, движок Excel сканирует недостаточно далеко, чтобы найти значения символов.

Механизм XLSX, новый, как мне кажется, в 9.3, и в целом полностью функциональный как для импорта, так и для экспорта в 9.4, будет лучше выполнять сканирование для переменных типов.Его довольно просто использовать, просто поменяйте DBMS=EXCEL на DBMS=XLSX.Он не будет полностью идентичным, если у вас есть (например) GETNAMES=NO, но для большинства случаев он идентичен.

PROC IMPORT OUT= data
DATAFILE= "data1.xlsx" 
DBMS=XLSX REPLACE;
SHEET="Sheet1"; 
GETNAMES=YES;
RUN;
0 голосов
/ 22 мая 2018

Быстрый ответ

Изменить запись реестра 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, чтобы обнаружить, что имеется нечисловое содержимое.Таким образом, при этом выводе при достижении нечислового содержимого процедура заменяет его отсутствующим значением.

Вам придется

  1. Принудительно выполнить ИМПОРТ для сканирования достаточного количества строк, чтобы найти нечисловые значения.в столбце (если есть).
    • Заставляет IMPORT определять эти столбцы (переменные) как символьный тип
  2. Постобработка импортированного набора данных на шаге 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 ().

Другой вопрос, если у вас возникнут проблемы с кодированием решения, которое выполняет одинаковое преобразование для всех переменных.

...