楼主: dxystata
3954 14

将aaa1和aaa2根据分开,得到新数据集 [推广有奖]

11
yongyitian 发表于 2014-1-21 11:34:47
用 %let 语句定义宏变量时, 等号(=)与第一个字符间的空格,和最后一个字符与分号( ;)间的空格会被自动删除。

lz 用 ! 作为分隔符。 当要分隔的字符为空时,可以用%str()函数来代替空格。这样定义的宏变量可读性强,而且在程序中也容易处理。 不一定要用
%let aaa1=m!!c!;
%let aaa2=!p!q!w!; 
  1. %let aaa1=m!%str( )!c!;
  2. %let aaa2=%str( )!p!q!;
  3. %let aaa3=r!s!%str( );
  4. %let aaa4=%str( )!%str( )!t!;

  5. %macro a(din=, dout=);
  6. data &dout;
  7.      array xyz{3} $ x y z;
  8.    if _n_ = 1 then do;
  9.        do macro_var = "&aaa1", "&aaa2", "&aaa3", "&aaa4";
  10.          do j = 1 to 3;
  11.            xyz[ j ] = scan(macro_var, j, '!');
  12.          end;
  13.          output;
  14.        end;
  15.    end;
  16.    set &din;
  17.    output;
  18.    keep x y z;
  19. Run;
  20. %mend a;

  21. %a(din=aaa, dout=bbb)
复制代码
已有 1 人评分经验 学术水平 热心指数 收起 理由
dxystata + 100 + 1 + 1 好的意见建议

总评分: 经验 + 100  学术水平 + 1  热心指数 + 1   查看全部评分

12
dxystata 发表于 2014-1-22 05:28:57
请版主扣我150论坛币,dengrong1989 farmman60 yongyitian各50论坛币!谢谢!

13
zw612003 发表于 2014-1-22 10:22:04
pobel 发表于 2014-1-21 08:32
%macro test(dset=aaa,out=bbb);
data &out;
    if 0 then set &dset;
神SAS,要继续学习!!

14
zw612003 发表于 2014-1-25 18:47:07
pobel 发表于 2014-1-20 07:43
data bbb;
    if 0 then set aaa;
        array tmp $ _all_;
想和你请教一下,为什么在%sysfunc里面写的代码很多时候都和外面写的不一样。找回这个帖子才知道怎么在%sysfunc里面用tranwrd,很悲剧,这个问题遇到两三次了。

%let a = A||B;
%let b = %sysfunc(tranwrd( &a.,|,%str( |)));

%put &b.;
data _null_;
b = tranwrd("&a.",'|',' |');
put b;
run;

15
pobel 在职认证  发表于 2014-1-26 08:59:04
zw612003 发表于 2014-1-25 18:47
想和你请教一下,为什么在%sysfunc里面写的代码很多时候都和外面写的不一样。找回这个帖子才知道怎么在%s ...
tranwrd的参数都是字符串,所以在data步环境下,字符串要用引号。而宏处理的时候是不需要引号。

所在的环境不一样,写法也就有所差别。
和谐拯救危机

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

本版微信群
加好友,备注cda
拉您进交流群
GMT+8, 2025-12-29 09:31