sas 宏字符串比较不等同于相同的方式
sas macro string-comparison does not equate in the same way
这个宏字符串比较对我来说以神秘的方式工作。对我来说显而易见的是 %test1(intotest)
和 %test2(intotest)
的结果是相等的。
%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()
相同的结果并且仍然使用数据表中的信息作为输入?
您的代码等于此数据步骤,在 运行 宏之后:
data datatable;
fromtable = 'b';
test1 = fromtable = "b";;
test2 = 0;
run;
SAS 语言旨在处理数据集(和其他来源)中的数据。宏语言旨在处理文本并生成SAS语言代码。
在您的第一个示例中,您成功地使用宏语言生成 SAS 代码 fromtable = "b";
,然后该 SAS 代码计算(对于每条记录)数据集变量的数据值 fromtable
等于文字值b
。顺便说一句,您不需要 %str() 函数。
在第二个示例中,您正在尝试(希望)使用宏语言来处理存储在数据步骤变量中的数据。宏语言不处理数据步数据。 [有一些例外,但我认为它们不会帮助您理解。]如所写,宏语言正在将文本字符串 fromtable
与文本字符串 "b"
进行比较(注意字符串是三个字符长,因为在宏语言中引号是值的一部分)。宏语言不知道有一个名为 fromtable
的数据步变量。它甚至不知道有数据步骤、数据集和数据集变量这些东西。因为文本字符串fromtable
不等于文本字符串"b"
,所以你的宏returns0.
第一个宏生成 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;
这个宏字符串比较对我来说以神秘的方式工作。对我来说显而易见的是 %test1(intotest)
和 %test2(intotest)
的结果是相等的。
%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()
相同的结果并且仍然使用数据表中的信息作为输入?
您的代码等于此数据步骤,在 运行 宏之后:
data datatable;
fromtable = 'b';
test1 = fromtable = "b";;
test2 = 0;
run;
SAS 语言旨在处理数据集(和其他来源)中的数据。宏语言旨在处理文本并生成SAS语言代码。
在您的第一个示例中,您成功地使用宏语言生成 SAS 代码 fromtable = "b";
,然后该 SAS 代码计算(对于每条记录)数据集变量的数据值 fromtable
等于文字值b
。顺便说一句,您不需要 %str() 函数。
在第二个示例中,您正在尝试(希望)使用宏语言来处理存储在数据步骤变量中的数据。宏语言不处理数据步数据。 [有一些例外,但我认为它们不会帮助您理解。]如所写,宏语言正在将文本字符串 fromtable
与文本字符串 "b"
进行比较(注意字符串是三个字符长,因为在宏语言中引号是值的一部分)。宏语言不知道有一个名为 fromtable
的数据步变量。它甚至不知道有数据步骤、数据集和数据集变量这些东西。因为文本字符串fromtable
不等于文本字符串"b"
,所以你的宏returns0.
第一个宏生成 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;