2014-02-07 23 views

ответ

4

В макроязыке SAS, все это строка символов, поэтому ваше заявление

%if prod = "&prod" %then %do; 

никогда не будет верно; строка prod никогда не будет равна строке «& prod», хотя бы потому, что одна строка содержит двойные кавычки, а другая нет.

Так что используйте двойные кавычки с обеих сторон или вообще нет. Любой из них будет лучше:

%if "prod" = "&prod" %then %do; 
%if prod = &prod %then %do; 

Кроме того, обратите внимание, что после этого ремонта, заявление будет «истинным» только тогда, когда макропеременная вы создали, имеет точное значение прод (эти четыре символа). Дело: prod не соответствует PROD

1

Лучший способ отлаживать что-то вроде этого - поставить его в инструкции %put, которую я вижу, что вы пытались сделать, но это может немного запутаться. Потому что ваше утверждение сравнения:

%if prod = "&prod" %then %do; 

Затем отладить его с %put вы должны включать в себя полное сравнение (с обеих сторон), чтобы сделать его выделиться больше:

%put prod = "&prod"; 

Выход из этого будет покажите, что строка слева от знака равенства не соответствует строке справа. Частью проблемы является то, что вы цитируете строку справа, но не слева. Даже если ваш макропеременная &prod содержал значение prod вы в основном тестирование этого условия:

prod = "prod" 

Лучше сравнение было бы обернуть обе строки в кавычках, как так:

%if "prod" = "&prod" %then %do; 

На самом деле в макросе язык - двойная кавычка почти похожа на любого другого персонажа. Таким образом, мы могли бы обернуть их символами, отличными от двойных котировок:

%if ###[email protected]@ = ###&[email protected]@ %then %do; 

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

%if prod = &prod %then %do; /* LEAST FAVOURITE OPTION AS IT CAN BE HARD TO DEBUG */ 

Надеется, что это помогает.

Смежные вопросы