2016-10-06 4 views
0

Это макро-сравнение строк работает для меня. Очевидным для меня было бы то, что результат %test1(intotest) и %test2(intotest) равны.sas macro string-сравнение не одинаково аналогично

%macro test1(intotest=); 
    %str(&intotest) = %str("b"); 
%mend; 

%macro test2(intotest); 
    %if %str(&intotest) = %str("b") %then 
     1; 
    %else 0; 
%mend EAF; 

data datatable; 
    fromtable = 'b'; 
    test1 = %test1(intotest=fromtable); 
    test2 = %test2(intotest=fromtable); 
run; 

Выход fromtable=b,test1=1,test2=0

Как бы переписать %test2() так, что она дает тот же результат, как %test1() и до сих пор используют информацию в DataTable в качестве входных данных?

+1

Это ужасное использование макрокода. Пожалуйста, не используйте это. Если это не академическое упражнение, что вы действительно пытаетесь сделать? Proc fcmp предназначен для функций. – Reeza

+1

Что означает '% mend EAF'? Я использовал «% mend» без аргументов или имя макроса, который вы хотите завершить. –

+0

@StigEide "ПРЕДУПРЕЖДЕНИЕ: Посторонний текст в% MEND-инструкции игнорируется для определения макроса TEST1." –

ответ

2

языка SAS предназначен для обработки данных в наборах данных (и других источниках). Язык макросов предназначен для обработки текста и генерации кода языка SAS.

В первом примере, вы успешно используете язык макросов для генерации коды SAS fromtable = "b";, а затем, что код SAS оценивает (для каждой записи), где значение данных переменного набора данных fromtable равно буквального значения b. В стороне, вам не нужна функция% str().

Во втором примере вы пытаетесь (надеетесь) использовать язык макросов для обработки данных, хранящихся в переменной шага данных. Язык макросов не обрабатывает данные шага данных. [Есть некоторые исключения, но я не думаю, что они помогли бы вам понять.] Как написано, макроязык сравнивает текстовую строку fromtable с текстовой строкой "b" (обратите внимание, что строка имеет длину три символа, потому что в цитате на макроязыке знаки являются частью значения). Язык макроса не знает, есть ли переменная шага данных с именем fromtable. Он даже не знает, что есть такие вещи, как шаги данных, наборы данных и переменные набора данных. Поскольку текстовая строка fromtable не равна текстовой строке "b", ваш макрос возвращает 0.

1

Ваш код равен этот шаг данных, после запуска макросов:

data datatable; 
    fromtable = 'b'; 
    test1 = fromtable = "b";; 
    test2 = 0; 
run; 
1

Первый макрос генерирует код SAS (включая ненужную дополнительную двоеточие), а второй генерирует только одно слово, которое либо 0, либо 1. Включите опцию MPRINT, и разница будет очевидна в журнале SAS.

67   data datatable; 
68    fromtable = 'b'; 
69    test1 = %test1(intotest=fromtable); 
MPRINT(TEST1): fromtable = "b"; 
70    test2 = %test2(intotest=fromtable); 
MPRINT(TEST2): 0 
71   run;