楼主: caibirdcnb
2163 5

[问答] 请问高手字符串如何转化为变量名?很着急!!! [推广有奖]

  • 0关注
  • 36粉丝

讲师

47%

还不是VIP/贵宾

-

威望
0
论坛币
1367 个
通用积分
16.5538
学术水平
67 点
热心指数
70 点
信用等级
64 点
经验
6762 点
帖子
206
精华
2
在线时间
433 小时
注册时间
2011-8-31
最后登录
2023-9-23

50论坛币
假设我有2个变量名var1 var2,一个是字符型一个是数字型。现在希望下面程序红色部分能把X解析为变量名。请问如何实现?非常感谢!
反过来变量名又如何转换为字符串?

%let checkList=var1 var2;
data _temp1;
                set lib.raw;
                length X $10.;
                do i=1 to 2;
                        X=scan("&checkList",i);
                       if function(X)=1 then ....;
               end;

run;

关键词:字符串 checklist function length check
沙发
Strive、 发表于 2017-11-12 09:13:10 |只看作者 |坛友微信交流群
  1. %let checkList=var1 var2;
  2. %macro a;
  3. data _temp1;
  4.         set lib.raw;
  5.     length X $10.;
  6.     %do i=1 %to 2;
  7.             %let X= %qscan(&checkList.,&i.);
  8.                 %put &X.;
  9.     %end;
  10. run;
  11. %mend a;
  12. %a;
复制代码
已有 1 人评分经验 论坛币 热心指数 收起 理由
admin_kefu + 60 + 10 + 2 热心帮助其他会员

总评分: 经验 + 60  论坛币 + 10  热心指数 + 2   查看全部评分

使用道具

藤椅
caibirdcnb 发表于 2017-11-12 09:56:10 |只看作者 |坛友微信交流群
Strive、 发表于 2017-11-12 09:13
不是这种意思,是要将字符串转SAS文本。你的程序是文本转文本。
所谓字符串就是在data步里面的var="XXX",那么XXX就是字符串。而%let x=XXX,其XXX就是SAS文本

使用道具

板凳
Strive、 发表于 2017-11-12 12:38:19 |只看作者 |坛友微信交流群
caibirdcnb 发表于 2017-11-12 09:56
不是这种意思,是要将字符串转SAS文本。你的程序是文本转文本。
所谓字符串就是在data步里面的var="XXX" ...
  1. data _temp1;
  2.     length X $100.;
  3.     x = "abc def ghi jkl";
  4.         i = 1;
  5.         do until(scan(x,i,' ') = "");
  6.                 CALL SYMPUTX("x"||put(i,z.),scan(x,i,' '));
  7.                 i + 1;
  8.         end;
  9. run;

  10. %put &x1 &x2 &x3 &x4;
复制代码

使用道具

报纸
caibirdcnb 发表于 2017-11-12 14:49:45 |只看作者 |坛友微信交流群
Strive、 发表于 2017-11-12 12:38
call symput没错,但我的需求是在同一data步内把call symput定义的宏变量的值取出来。 请看看我的示例程序。我需要某2个函数或技巧,其中fun1是将字符串赋值给数据集的变量fun2是将变量的值变成SAS文本。这才是我的需求。谢谢!


下面程序期望:1. 变量X的值是字符串var1=var2,2. fun2(X)的值是SAS文本var1=var2

%let checkList=var1 var2;
data _temp1;
                set lib.raw;
                length X $10.;
                do i=1 to 2;
                        X=X||'='||fun1("&checkList",i);
                       if fun2(X)=1 then ....;
               end;

run;

使用道具

地板
Strive、 发表于 2017-11-12 18:51:49 |只看作者 |坛友微信交流群
caibirdcnb 发表于 2017-11-12 14:49
call symput没错,但我的需求是在同一data步内把call symput定义的宏变量的值取出来。 请看看我的示例程序 ...
这个目前没找到实现方法,symput的宏变量没法在同一个data步使用的
symput是在data步运行的时候产生的,而宏编译是在之前。

使用道具

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

本版微信群
加好友,备注cda
拉您进交流群

京ICP备16021002-2号 京B2-20170662号 京公网安备 11010802022788号 论坛法律顾问:王进律师 知识产权保护声明   免责及隐私声明

GMT+8, 2024-4-28 15:12