Разрешение переменных макросов SAS - PullRequest
0 голосов
/ 27 июня 2019

Мне любопытно, почему некоторые функции не могут правильно интерпретировать тип символа макропеременной.

Вот пример программы

%let yymm = 1905;

data tst; 
reportDate = input(&yymm.,yymmn4.); 
run;

выдаст числовое значение, reportDate,с нулем, связанным с ним.

Но любая из следующих программ:

data tst;
reportDate = input("&yymm.",yymmn4.);
run;

data tst;
reportDate = input(put(&yymm.,4.),yymmn4.);
run;

приведет к правильному значению, 21670.

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

Ответы [ 2 ]

2 голосов
/ 27 июня 2019

После того, как макропроцессор завершил свою магию, сгенерированный код SAS затем активируется самим SAS.

Причина, по которой такой код:

reportDate = input(1905,yymmn4.);

приводит к отсутствующему значениюобъясняется примечанием, что SAS записывает в журнал.

478   data tst;
479   reportDate = input(1905,yymmn4.);
480   run;

NOTE: Numeric values have been converted to character values at the places given by: (Line):(Column).
      479:20

Поскольку вы использовали число вместо строки символов для первого аргумента в функции INPUT (), SAS преобразовал его в строку символов для вас.Когда он это сделал, он использовал формат BEST12., чтобы вы получили строку ' 1905', которая начинается с 8 пробелов.Поскольку вы используете ширину всего 4 символа в вашем информате, результат является пропущенным значением.Последние 8 символов преобразованной строки игнорируются.

Две другие версии исправляют это, давая вместо этого INPUT () строковое значение.Либо путем генерации фактического строкового литерала, либо с помощью функции PUT (), чтобы преобразовать число в строку, используя формат, который не производит начальные пробелы.

2 голосов
/ 27 июня 2019

Цитировать вокруг переменной.

%let yymm = 1905;

data tst; 
reportDate = input("&yymm.",yymmn4.); 
run;

без кавычек пытается это сделать:

 data tst; 
    reportDate = input(1905,yymmn4.); 
 run;
...