SAS中文论坛

 找回密码
 立即注册

扫一扫,访问微社区

查看: 1600|回复: 12
打印 上一主题 下一主题

简单的macro程序出现问题,还望大家指点

[复制链接]

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
楼主
 楼主| 发表于 2009-6-26 10:42:48 | 只看该作者

简单的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 秒
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
沙发
 楼主| 发表于 2009-6-26 10:50:18 | 只看该作者

Re: 简单的macro程序出现问题,还望大家指点

敌手乱说,
第608行莫维少了个分好。
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
板凳
 楼主| 发表于 2009-6-26 21:53:01 | 只看该作者

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;
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
地板
 楼主| 发表于 2009-6-29 09:01:20 | 只看该作者

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!
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
5#
 楼主| 发表于 2009-6-29 09:01:57 | 只看该作者

Re: 简单的macro程序出现问题,还望大家指点

to 徐福贵

好像没有少分号
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
6#
 楼主| 发表于 2009-6-29 10:46:31 | 只看该作者

Re: 简单的macro程序出现问题,还望大家指点

看上去没有少分号,那是从语法的角度讲,
其实是少了个分号,这是从逻辑的角度讲。

看上去没有少,所以编译不会出错。
实际上是少了,所以执行就没结果。
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
7#
 楼主| 发表于 2009-6-29 11:01:16 | 只看该作者

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]
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
8#
 楼主| 发表于 2009-6-30 07:46:09 | 只看该作者

Re: 简单的macro程序出现问题,还望大家指点

to ahuige

的确是少了分号。请问原因是%THEN 吃掉了一个分号吗?
有时候为了避免歧义,我总写成%THEN%DO;%END语句。不知道能否赐教其中真正缘由?
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
9#
 楼主| 发表于 2009-6-30 09:49:10 | 只看该作者

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]
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
10#
 楼主| 发表于 2009-6-30 18:00:29 | 只看该作者

Re: 简单的macro程序出现问题,还望大家指点

针对hopewell的程序,ahuige的解释太有哲理了,不过就本类我还是不明白,就在macro t中去掉if和else前门的%问题就解决了,多谢各位的解答
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|手机版|Archiver|SAS中文论坛  

GMT+8, 2026-2-5 17:57 , Processed in 0.134441 second(s), 19 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表