楼主: firefox29
2431 4

求教合并宏变量的操作 [推广有奖]

  • 11关注
  • 1粉丝

博士生

28%

还不是VIP/贵宾

-

威望
0
论坛币
0 个
通用积分
0.2251
学术水平
1 点
热心指数
1 点
信用等级
1 点
经验
3694 点
帖子
131
精华
0
在线时间
305 小时
注册时间
2012-1-23
最后登录
2023-6-20

楼主
firefox29 发表于 2015-1-5 14:07:20 |AI写论文

+2 论坛币
k人 参与回答

经管之家送您一份

应届毕业生专属福利!

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

经管之家联合CDA

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

感谢您参与论坛问题回答

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

+2 论坛币
现在有两个宏变量 &file 和&ul;%let file=fileindex;
%let ul=11;

我实际上需要使用宏变量 &file11 (假定其已经赋值);

尝试了各种办法:
%put &file. &ul.;
%put  &&file.&ul.    ;
%put  &&file.%left(&ul.)    ;
%put  &&file.&ul.    ;
%put  &&file.&ul.    ;

结果显示各种不对;
求教如何合并起来使用?
====================================分割线=================================
之前的问题可能没表述清楚,实际问题是这样的:
我有一个文件的索引集 fileindex, 然后想把每个文件名放入一个宏变量中,ul (uplimit)代表最后一个文件名的编号,此处是970;
放完之后,我是想看一下最后一个宏变量,即&file970. ,但是970是事先不知道的,即我希望输出&&file&ul. 的值,我并不知道它是&file970;

data _null_;set fileindex nobs=m;
call symput('ul',m);
run;

proc sql noprint;
select x into: file1-:file%left(&ul.) from fileindex
;quit;

%put &file970;   显示了文件名,说明该宏变量存在,但用各种&&file&ul. 无法显示。

求教如何解决上述问题?
二维码

扫码加我 拉你入群

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

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

关键词:proc sql symput Select Index print 分割线 file 如何

沙发
sushe1527 发表于 2015-1-5 14:30:55
  1. %let fileindex11=12345;

  2. %let file=fileindex;
  3. %let ul=11;
  4. %put  &&&file&ul;
复制代码

QQ截图20150105143013.jpg (62.66 KB)

QQ截图20150105143013.jpg

已有 1 人评分学术水平 热心指数 信用等级 收起 理由
firefox29 + 1 + 1 + 1 热心帮助其他会员

总评分: 学术水平 + 1  热心指数 + 1  信用等级 + 1   查看全部评分

藤椅
sniperhgy 发表于 2015-1-5 15:22:21
楼主你好,宏变量连接解析的时候,不要加入那个“.”,因为&已经包含了宏变量起始和终止的意思也就是说,
%put &&file&ul;或者%put &&file&ul.;就可以达到&file11的效果了。

加入那个点之后,解析的时候,就会把那部分单独来看了,用楼主的程序来解释就是:
  1. %put &file. &ul.;
  2. 经过一次扫描,就会变成
  3. %put fileindex 11
  4. 所以最后的结果就是
  5. fileindex 11
复制代码
  1. %put &&file.&ul.;
  2. 经过一次扫描,就会变成
  3. %put &file.11
  4. 这里面编译器发现还有一个&号,所以要进行二次扫描,但是因为有一个点的存在,所以编译器会认为&file是独立的,和那个11没有关系,第二次扫描就变成
  5. %put indexfile11
  6. 所以最后的结果就是
  7. fileindex11
复制代码
第三个那个加上%left和第二个一样的道理,所以也是不对的结果。
已有 2 人评分学术水平 热心指数 信用等级 收起 理由
heguima + 1 + 1 + 1 精彩帖子
firefox29 + 1 + 1 + 1 热心帮助其他会员

总评分: 学术水平 + 2  热心指数 + 2  信用等级 + 2   查看全部评分

板凳
sniperhgy 发表于 2015-1-6 13:41:43
问题所在之处是因为call symput的时候,没有把ul的空格去掉。
  1. data fileindex;
  2.   input x $2.;
  3.   cards;
  4. 1
  5. 2
  6. 3
  7. 4
  8. 5
  9. 6
  10. 7
  11. 10
  12. ;
  13. run;

  14. data _null_;
  15.   set fileindex nobs = m;
  16.   call symput('ul', strip(m));
  17. run;

  18. proc sql noprint;
  19.   select x into: file1-:file%left(&ul.)
  20.   from fileindex
  21.   ;
  22. quit;

  23. %put &&file&ul.;
复制代码
试试这个程序。
已有 2 人评分学术水平 热心指数 信用等级 收起 理由
heguima + 1 + 1 + 1 精彩帖子
firefox29 + 1 + 1 + 1 精彩帖子

总评分: 学术水平 + 2  热心指数 + 2  信用等级 + 2   查看全部评分

报纸
firefox29 发表于 2015-1-7 11:34:19
sniperhgy 发表于 2015-1-6 13:41
问题所在之处是因为call symput的时候,没有把ul的空格去掉。试试这个程序。
的确是细节决定结果``3Q大侠~

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

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