3

我有输入文件,其中第一行有标题信息。(制表符分隔的数据值)。在这些值中,有一个整数值指定应如何解析文件的其余部分。如果该值小于阈值,则应以一种方式解析文件,否则如果该值大于阈值,则应以不同方式解析数据。

%let isNew = Undefined;

data header;
infile "&infile" OBS=1;
INPUT Agency $ Status $ Num $ fdate sdate;
if fdate < 20130428 then
 %let isNew = false;
else
 %let isNew = true;
run;

data factors;
infile "&infile" missover FIRSTOBS=2 LRECL=1000;
if isNew = false then
 input
   @1   poolno                  $6.
   @7   factor                  9.8 @;
else
 input
   @3   poolno                  $6.
   @9   factor                  9.8 @;

(some more input parsing code)

在上面的代码中,我定义了一个变量 isNew 并根据条件检查将该变量设置为真/假。在后续的数据块中,我使用这个变量的值来决定文件的解析方式。

示例输入文件是(要检查的值以粗体显示):

FHLMC 更新 #1 20130130 20130306

138788024201321000

140379000000000000

我是 SAS 新手。请问有什么建议吗?

4

1 回答 1

4

您正在混淆数据步骤变量和宏变量。您不能有条件地执行这样的 %LET 语句(而且您不想这样做)。CALL SYMPUT 是您创建宏变量的方式,如果您愿意的话;但在这种情况下,您不需要,因为您可以在一个数据步骤中执行所有这些操作:

data want;
informat fdate sdate YYMMDD8.;
retain Agency Status Num fdate sdate;
if _n_ = 1 then do;
  input Agency $ Status $ Num $ fdate sdate;
end;
else do;
    if fdate < '28APR2013'd then input
       @1   poolno                  $6.
       @7   factor                  9.8;
    else
     input
       @3   poolno                  $6.
       @9   factor                  9.8;

    output;
end;
datalines;
MyAgency MyStatus MyNum 20130401 20130501
MyPool123456783123
MyPoo2435678904123
;;;;
run;

现在,要注意的一件事 - 您通常不会将小数添加到信息中(即@9 因子 9.8),除非您有一个没有小数的数字并且您想要添加它。IE,在我创建的数据中,我没有小数点(123456783),它会加一个(1.23456783)。但是,如果小数点已经在数据中,即 1.23456783 在您的数据文件中,那么您只需将其输入为 9。让 SAS 为您放置小数点。此外,如果您对此进行测试,请确保将数据线移动到第一列(将它们缩进 4 会导致此操作失败)。

此外,您需要学习如何使用 SAS 日期 - 看看我是如何稍微改变它的。

于 2013-03-11T14:47:31.883 回答