我是SAS的新手,并且很难确定何时应该使用简单的If-Then-else以及何时应该使用%IF-%THEN-%ELSE。作为下面的示例代码:
%let inFile = %scan(&sysparm, 1, " ");
%macro read_data(infile);
data want;
infile "&infile" LRECL=1000;
retain fdate;
if _n_ = 1 then do;
input Agency $ Status $ Num $ fdate sdate;
end;
else do;
%if fdate < 20130428 %then
input
@1 poolno $6.
@7 factor 9.8 @;
%else
input
@1 rectype $1
@3 poolno $6.
@9 factor 9.8 @;
@18 pfactor 9.8;
output;
end;
drop Agency Status Num sdate;
run;
proc print data=want;
run;
%mend read_data;
%read_data(&inFile);
我正在尝试获取第一行(标题)并获取参数fdate。根据此参数的值,我将以不同方式解析后续输入行。 但这似乎不起作用,因为只有第二个输入部分运行(总是在输出中得到参数&#39; rectype&#39;)。
我可能做错了什么建议?
答案 0 :(得分:2)
我发现你有C ++作为你的标签之一,而你刚刚开始使用SAS。所以我会尝试根据您的背景提供答案。
了解SAS宏命令与DATA步骤或多个具有相同名称的过程中的命令之间区别的最简单方法,例如%if vs. if ,将SAS宏命令视为等效于C / C ++预处理器(CPP)指令。 CPP和SAS MAcro都是宏语言,虽然它们不是完全相同的语言,但它们共有两个重要的,最初令人困惑的特征:它们是文本处理器;它们在主代码处理之前作为单独的步骤执行。
有些地方会出现这种近似值,但作为初学者,在C / C ++中有背景,这是一个很好的起点。
答案 1 :(得分:1)
在任何数据步骤语句之前编译宏语句%if。这意味着您通常无法在逻辑表达式中使用数据步变量。当宏处理器正在编译宏语句时,数据步骤变量尚不存在。
答案 2 :(得分:0)
在上面的示例中,%IF条件基于datastep变量/值。这应该表明可以使用datastep“if”而不是%IF来实现。
已经收到了相应答案答案 3 :(得分:0)
如果您执行%if fdate < 20130428
SAS,则不会比较文字fdate
和20130428
值od fdate
和20130428
。
如果你有一个名为fdate
的宏变量,你可以%if &fdate < 20130428
。
在您的情况下,fdate
是数据集中的变量,因此请使用if
而非%if
,但您似乎正在尝试使用宏创建数据步骤,以便使用if
可能在这种情况下不起作用(取决于你想要得到什么)。