Двоеточие, предшествующее информатам в выражении SAS INPUT - PullRequest
1 голос
/ 21 февраля 2020

Мне интересно, почему, если SAS читает через оператор INPUT на шаге данных только переменную (и) даты, представляется необходимым написать двоеточие перед каждым именем informat, тогда как, если список переменных начинается с переменная другого типа (например, символьная переменная), двоеточия перед информатами не нужны. Для иллюстрации моего вопроса две небольшие программы (см. Ниже). Первый генерирует недопустимые данные для даты (пока я не пишу двоеточие до mmddyy10., Чтобы получить INPUT date: mmddyy10.; ), в то время как второй нет. Странно, не правда ли? Возможно, этому есть какое-то объяснение, но, несмотря на поиск в документации по поддержке SAS и на форумах, я не могу понять, что это может быть. Любая помощь приветствуется! В любом случае, если бы я раньше понял, о чем идет речь, я сэкономил пару часов, потраченных на решение этого вопроса.

* program #1;
DATA _NULL_;
    INPUT date mmddyy10.;
    DATALINES;
    09/14/2012
    09/15/2012 
    ;
  RUN;
  PROC PRINT; RUN;

* program #2;
  DATA _NULL_;
     INPUT id $ date mmddyy10.;
   DATALINES;
    A 09/14/2012
    B 09/15/2012 
   ;
  RUN;

1 Ответ

1 голос
/ 21 февраля 2020

В своей первой программе вы сказали SAS прочитать первые 10 символов как дату. Но первые 4 символа - это пробелы. Итак, вы попросили его попытаться преобразовать ' 09/14/' в дату. Я рекомендую всегда вводить оператор DATALINES (он же CARDS), начиная с первого столбца, чтобы функция автоматического отступа вашего редактора не приводила к отступу строк данных.

Двоеточие (:) в перед спецификацией inline informat указывает SAS использовать ввод в режиме списка вместо форматированного ввода. При форматированном вводе SAS считывает количество символов, указанное в формате. В режиме списка SAS считывает следующее поле в строке, основываясь на текущем параметре разделителя и dsd. Ширина, используемая для информации, корректируется в соответствии с фактической шириной следующего поля в строке.

Пример:

data test;
  length name1-name3 $30 ;
  input @1 name1
        @1 name2 $5.
        @1 name3 :$5. 
  ;
cards;
Elizabeth
;

Результаты:

Obs      name1      name2      name3

 1     Elizabeth    Eliza    Elizabeth
...