楼主: wencycooll
3818 9

[原创博文] 请问一下sas宏形参如何传递呢? [推广有奖]

  • 1关注
  • 0粉丝

等待验证会员

大专生

13%

还不是VIP/贵宾

-

威望
0
论坛币
43 个
通用积分
0
学术水平
0 点
热心指数
0 点
信用等级
0 点
经验
251 点
帖子
28
精华
0
在线时间
53 小时
注册时间
2011-11-30
最后登录
2014-4-19

楼主
wencycooll 发表于 2012-2-22 17:19:40 |AI写论文

+2 论坛币
k人 参与回答

经管之家送您一份

应届毕业生专属福利!

求职就业群
赵安豆老师微信:zhaoandou666

经管之家联合CDA

送您一个全额奖学金名额~ !

感谢您参与论坛问题回答

经管之家送您两个论坛币!

+2 论坛币
有两个问题:
第一个是在%let n=length(xx);中 length函数不能使用吗?我试了下总是报错。
第二个问题是如何给宏传递形参呢?
比如:
data test;
set test1;
n=length(name);
%chage(&n);
run;
我想把n的值也就是name的长度传给chage这个宏,但是总是报错,我该如何写呢?
二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

关键词:SAS宏 length leng name test

回帖推荐

Jackywolf_2008 发表于3楼  查看完整内容

数据集变量和宏变量是两个概念,在同一个data step中不可使用数据集的变量给宏变量赋值,因为在run;语句提交前,宏变量还不存在。 你提的第一个问题可以这样写, 但是abc只能代表一个字符串或者是一个宏变量,不是数据集变量。 %let len=%sysfunc(length(abc)); %put &len; 第二个问题,可以这样写 data test; set test1; n=length(name); call symput('n',n); run; %chage(&n);

沙发
zhangzachary 发表于 2012-2-22 17:27:57
call symput("n",length(name));
寒冰凤凰 My blog: http://blog.sina.com.cn/u/1058955485

藤椅
Jackywolf_2008 发表于 2012-2-22 17:39:28
数据集变量和宏变量是两个概念,在同一个data step中不可使用数据集的变量给宏变量赋值,因为在run;语句提交前,宏变量还不存在。
你提的第一个问题可以这样写, 但是abc只能代表一个字符串或者是一个宏变量,不是数据集变量。
%let len=%sysfunc(length(abc));
%put &len;
第二个问题,可以这样写
data test;
set test1;
n=length(name);
call symput('n',n);
run;
%chage(&n);

板凳
wencycooll 发表于 2012-2-23 12:53:25
Jackywolf_2008 发表于 2012-2-22 17:39
数据集变量和宏变量是两个概念,在同一个data step中不可使用数据集的变量给宏变量赋值,因为在run;语句提交 ...
太感谢您了,您从根本上解决了我心中的疑惑,如果有多个变量需要调用的话,比如宏中有两个变量。那么就需要在data步骤里面用两次 call symput()函数来调用这两个参数对吧?还有就是我用call symput()函数,运行的结果是只把最后一个观测的变量的values传出去了,而不是每一个都传出去了。怎么回事儿呢?请看下面这个例子:proc sql;
create table customer(
id int,
name char(50)
)
;
data test1;
input id name $;
datalines;
1 wang
2 lei
3 wency
4 lucy
5 jacky
;
run;

data test;
set test1;
call symput('id',id);
call symput('name',name);
run;
%chage(&id,&name);
%macro chage(id,name);
proc sql;
insert into customer (id,name) values (&id,&name);
%mend;

我想把test1的值保存在test里面的同事还保存到表customer中,就用了这个宏。有两个问题,第一 values后面跟的参数总是报错,说格式不对。第二,就算运行成功 customer表里面也只有一个值,就是test1的最后一个观测。5 jacky。 我该怎么办才能把所有记录都保存呢,难道symput只能读取最后一个观测?

报纸
Jackywolf_2008 发表于 2012-2-23 13:53:58
value报错,是因为name在customer表中是字符型的,你需要用双引号引起来。
第二个问题的方法有很多,我这只是其中一种,未必是最优,仅供参考。
proc sql noprint;
create table customer(
id int,
name char(50)
)
;
quit;

data test1;
input id name $;
datalines;
1 wang
2 lei
3 wency
4 lucy
5 jacky
;
run;

data test;
set test1 nobs=total end=last;
call symput(cats('id',_N_),id);
call symput(cats('name',_N_),name);
if last then call symput('total',total);
run;
%put &total;


%macro chage(id,name,obsnum);
proc sql;
%do i=1 %to &obsnum;
insert into customer (id,name) values (&&id&i,"&&name&i");
%end;
quit;
%mend;
%chage(id,name,&total);

地板
wencycooll 发表于 2012-2-23 14:10:17
Jackywolf_2008 发表于 2012-2-23 13:53
value报错,是因为name在customer表中是字符型的,你需要用双引号引起来。
第二个问题的方法有很多,我这只 ...
我不知道该如何谢谢你,我刚注册分数太少了。1023141064我qq有什么事情安排小弟,小弟万死不辞。

7
wencycooll 发表于 2012-2-23 16:50:54
Jackywolf_2008 发表于 2012-2-23 13:53
value报错,是因为name在customer表中是字符型的,你需要用双引号引起来。
第二个问题的方法有很多,我这只 ...
call symput(cats('id',_N_),id); 为什么需要加上_N_呢,我发现如果不加上的话,宏只会读取最后一条记录。还有就是&&id&i,"&&name&i" 我第一次见这种写法啊。我平常都是&id,'&name’这样子。你这样子写法有什么依据么?我想多了解点,麻烦了。

8
Jackywolf_2008 发表于 2012-2-23 18:27:14
_N_ 是data step中的一个自动产生的变量,就是一个序列号,从1开始,每对于一条观测,递增1,既从1到数据既的观测数,如果不加入_N_,你上一条产生的宏变量的值,会被下一条覆盖,这就是为什么之前你觉得只会输出最后一条的值,其实他是循环覆盖了N次,所以需要加上_N_,让每次输出的宏变量的名字都不一样,这样就不会覆盖。
&&符号在解析的时候会解析为1个&,就是逐级解析宏变量,如&&name&i,第一次解析变成&name1,1是由&i解析出来的,&name是由&&name解析来的,所以在第二次解析的时候&name1就是解析为你实际的值,如
wang,这种写法一般是在宏循环的时候用。至于细节,你参考SAS Macro的帮助文档吧,或者在google上搜搜。

9
wencycooll 发表于 2012-2-24 14:14:34
Jackywolf_2008 发表于 2012-2-23 18:27
_N_ 是data step中的一个自动产生的变量,就是一个序列号,从1开始,每对于一条观测,递增1,既从1到数据既 ...
解释的非常精彩!我能加你为好友么,qq好友,如果不方便透露敬请加我好吗1023141064,我可以给你做一些脚下活。你sas太厉害了,我很想给你成为朋友,我数据库方面的只是还行。

10
Jackywolf_2008 发表于 2012-2-24 17:02:49
你可以多看看SAS的帮助文档,对学习SAS非常有帮助,熟能生巧,而且还能锻炼英文,QQ就算了,我平时不怎么上QQ,公司不让装啊,有什么事可以在论坛里发消息,不忙的时候我会上论坛逛逛,但是忙起来可能就没时间来这里了。

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

本版微信群
加好友,备注cda
拉您进交流群
GMT+8, 2026-1-2 07:48