3

I am new to SAS and having a hard time figuring out when should the simple If-Then-else and when should %IF-%THEN-%ELSE should be used. As an example code below:

%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);

I am trying to get the first line(header) and taking the parameter fdate. Based on the value of this parameter, I am parsing the subsequent input lines differently. But this does not seem to work, as only the second input part runs (always getting parameter 'rectype' in output).

Any suggestions as what i might be doing wrong?

4

4 回答 4

2

我看到您将 C++ 作为您的标签之一,并且您刚刚开始使用 SAS。因此,我将尝试提供针对您的背景的答案。

理解 SAS 宏命令与 DATA 步中的命令或多个具有相同名称的 proc 中的命令(如%ifif)之间的区别的最简单方法是将 SAS 宏命令视为等同于 C/C++ 预处理器(CPP) 指令。CPP 和 SAS MAcro 都是宏语言,虽然它们不是完全一样的语言,但它们有两个重要且最初令人困惑的特征:它们是文本处理器;并且它们在处理主代码之前作为单独的步骤执行。

这种近似在某些地方会失效,但作为具有 C/C++ 背景的 SAS 初学者,这是一个很好的起点。

于 2013-03-13T02:17:37.003 回答
1

宏语句 %if 在任何数据步语句之前编译。这意味着您通常无法在逻辑表达式中使用数据步长变量。宏处理器在编译宏语句时,数据步长变量还不存在。

于 2013-03-19T23:14:50.317 回答
0

如果你这样做%if fdate < 20130428SAS 比较文字fdate20130428不是值 odfdate20130428.

如果你有一个名为的宏变量fdate,你会这样做%if &fdate < 20130428

在您的情况下fdate,是数据集中的变量,因此请使用ifnot %if,但您似乎正在尝试使用宏创建数据步骤,因此if在这种情况下仅使用可能无法正常工作(取决于您要获得什么)。

于 2013-03-12T14:43:57.670 回答
0

在上面的示例中,%IF 条件基于数据步变量/值。这应该表明它可以使用数据步“if”而不是 %IF 来实现。

您已经在上一个问题中收到了对此的答案,https://stackoverflow.com/a/15341502/108797

于 2013-03-12T14:07:10.237 回答