SAS中文论坛

标题: 简单的macro程序出现问题,还望大家指点 [打印本页]

作者: shiyiming    时间: 2009-6-26 10:42
标题: 简单的macro程序出现问题,还望大家指点
代码:
data varlist;
   length var $ 10;
   input var $ @@;
   cards;
   extc010010 extc010020 extc030020 extc030040
   ;
run;
data _null_;
   set varlist end=last;
   call symput('varname_'||compress(_n_),var);
   if last then call symput('nvar',compress(_n_));
run;

data test;   *将数据集中大于2的值通通设为1
   set sasuser.dataset;
   %macro t;
       %do i=1 %to &nvar;
               %if &&varname_&i>2 %then &&varname_&i=1;
                   %else &&varname_&i=0;
          %end;
  %mend t;
        %t;
run;


dataset数据集如下:
extc010010 extc010020 extc030020 extc030040
19                       0             0                   11
0                         5            7                     0

运行结果:
data test;
604     set sasuser.dataset;
605     %macro t;
606         %do i=1 %to &nvar;
607             %if &&varname_&i>2 %then &&varname_&i=1;
608             %else &&varname_&i=0;
609        %end;
610    %mend t;
611      %t;
NOTE: 由宏变量“VARNAME_2”生成行。
1     extc010020
      ----------
      22
NOTE: 由宏变量“VARNAME_3”生成行。
1       extc030020
        ----------
        22
NOTE: 由宏变量“VARNAME_4”生成行。
1       extc030040
        ----------
        22
ERROR 22-322: 语法错误,期望下列之一: !, !!, &, *, **, +, -, /, ;, <, <=, <>, =, >, ><, >=, AND, EQ, GE, GT, IN, LE,
              LT, MAX, MIN, NE, NG, NL, NOTIN, OR, ^=, |, ||, ~=.

612  run;

NOTE: SAS 系统由于错误而停止了该步的处理。
WARNING: 数据集 WORK.TEST 可能不完整。该步停止时,共有 0 个观测和 4 个变量。
WARNING: 数据集 WORK.TEST 由于该步已停止,而没有被替换。
NOTE: “DATA 语句”所用时间(总处理时间):
      实际时间         0.07 秒
      CPU 时间         0.00 秒
作者: shiyiming    时间: 2009-6-26 10:50
标题: Re: 简单的macro程序出现问题,还望大家指点
敌手乱说,
第608行莫维少了个分好。
作者: shiyiming    时间: 2009-6-26 21:53
标题: Re: 简单的macro程序出现问题,还望大家指点
first, it's better to define the macro before the data step.
second, pay attention on macro statements and open code statements.

%macro t;
%do i=1 %to &nvar;
if &&varname_&i>2 then &&varname_&i=1;
else &&varname_&i=0;
%end;
%mend t;

data test;  
set sasuser.dataset;
%t;
run;
作者: shiyiming    时间: 2009-6-29 09:01
标题: Re: 简单的macro程序出现问题,还望大家指点
to sun59338

First,thanks for your suggestion on my programming style.
But, for the case above,the code struction is not the key problem .
Looking forword to new reply!
作者: shiyiming    时间: 2009-6-29 09:01
标题: Re: 简单的macro程序出现问题,还望大家指点
to 徐福贵

好像没有少分号
作者: shiyiming    时间: 2009-6-29 10:46
标题: Re: 简单的macro程序出现问题,还望大家指点
看上去没有少分号,那是从语法的角度讲,
其实是少了个分号,这是从逻辑的角度讲。

看上去没有少,所以编译不会出错。
实际上是少了,所以执行就没结果。
作者: shiyiming    时间: 2009-6-29 11:01
标题: Re: 简单的macro程序出现问题,还望大家指点
[code:1pwbgt4s]data varlist;
        length var $ 10;
        input var $ @@;
        cards;
extc010010 extc010020 extc030020 extc030040
;

data dataset;
        input extc010010 extc010020 extc030020 extc030040;
        datalines;
19 0 0 11
0 5 7 0
;

data _null_;
        set varlist end=last;
        call symput('varname_'||compress(_n_),var);
        if last then call symput('nvar',compress(_n_));
run;
%put _user_;

options mprint;
%macro t;
        %do i=1 %to &nvar;
                if &&varname_&i>2 then &&varname_&i=1;
                else &&varname_&i=0;
        %end;
%mend t;

data test;
        set dataset;
        %t
run;[/code:1pwbgt4s]
作者: shiyiming    时间: 2009-6-30 07:46
标题: Re: 简单的macro程序出现问题,还望大家指点
to ahuige

的确是少了分号。请问原因是%THEN 吃掉了一个分号吗?
有时候为了避免歧义,我总写成%THEN%DO;%END语句。不知道能否赐教其中真正缘由?
作者: shiyiming    时间: 2009-6-30 09:49
标题: Re: 简单的macro程序出现问题,还望大家指点
在宏编译器眼里,所有非宏关键字都是文本。
但宏命令需要一个分号做为宏语句的结束。
多余的分号才是文本。你想生成的语句是包含一个分号的普通SAS语句,但这里的两个红分号都被宏语句使用了。
%if &&varname_&i>2 %then &&varname_&i=1[color=#FF0000:1haobaqt][b:1haobaqt][size=200:1haobaqt];[/size:1haobaqt][/b:1haobaqt] [/color:1haobaqt]
%else &&varname_&i=0[color=#BF0040:1haobaqt][b:1haobaqt][size=200:1haobaqt];[/size:1haobaqt][/b:1haobaqt][/color:1haobaqt]
作者: shiyiming    时间: 2009-6-30 18:00
标题: Re: 简单的macro程序出现问题,还望大家指点
针对hopewell的程序,ahuige的解释太有哲理了,不过就本类我还是不明白,就在macro t中去掉if和else前门的%问题就解决了,多谢各位的解答
作者: shiyiming    时间: 2009-6-30 20:53
标题: Re: 简单的macro程序出现问题,还望大家指点
[color=#FF4080:vfrxy84g]if &&varname_&i>2 then &&varname_&i=1;
      else &&varname_&i=0;[/color:vfrxy84g]

AHUIGE的解释是有说服力的。
经过MACRO的编辑,只有以上所引用的即为文本的东西留下来,当然内中的MACRO变量已被解释过。
因为DATA STEP 是在OPEN CODE里,当然%已成为累赘或者说是错误的。
作者: shiyiming    时间: 2009-7-1 21:36
标题: Re: 简单的macro程序出现问题,还望大家指点
to whbh1984

Do my code generate the result you want?
作者: shiyiming    时间: 2009-7-2 10:54
标题: Re: 简单的macro程序出现问题,还望大家指点
to sun59338

yes ,you are right
But the fatal mistake is the three "%"




欢迎光临 SAS中文论坛 (https://mysas.net/forum/) Powered by Discuz! X3.2