楼主: BraveMadMan
3631 17

[问答] 如何根据数据库的变量数产生一个宏变量 [推广有奖]

  • 1关注
  • 6粉丝

已卖:97份资源

讲师

16%

还不是VIP/贵宾

-

威望
0
论坛币
966 个
通用积分
6.3763
学术水平
26 点
热心指数
42 点
信用等级
10 点
经验
7812 点
帖子
300
精华
0
在线时间
552 小时
注册时间
2005-8-11
最后登录
2021-5-20

楼主
BraveMadMan 发表于 2011-1-15 17:19:17 |AI写论文
20论坛币
比如我的数据有7个变量,我要产生一个宏变量,其内容为 "ccccccc"。也就是说,这个宏变量里的“c”的个数是由数据的变量数决定的。当然,这段程序要是动态的。碰到一个10个变量的数据,那么这个宏变量的内容就应该是"cccccccccc"。

例子:

data have;
input v1-v7;
cards;
1 1 1 1 1 1 1
;
run;

现在要定义一个宏变量, want,其内容为 "ccccccc"。

%put &want.;

输出的结果应该是
ccccccc
关键词:数据库 Input cards Want Data 变量 数据库

本帖被以下文库推荐

Don't get lost in technical details. What is the big picture?

沙发
hopewell 发表于 2011-1-15 17:19:18
  1. data have;
  2.     input v1 $ v2-v6 v7 $;
  3. cards;
  4. 1 1 1 1 1 1 1
  5. ;
  6. proc sql noprint;
  7.     select case type
  8.                 when 'char' then 'l'
  9.                 else 'c'
  10.            end into :want separated by ''
  11.         from sashelp.vcolumn
  12.         where libname='WORK' and memname='HAVE';
  13. quit;
  14. %put NOTE: *** &want ***;
复制代码
已有 1 人评分学术水平 热心指数 信用等级 收起 理由
BraveMadMan + 1 + 1 + 1 多谢精彩程序

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

观钓颇逾垂钓趣 种花何问看花谁

藤椅
BraveMadMan 发表于 2011-1-15 17:29:33
相关问题:如果这个数据有2个字符变量,5个数字变量,产生一下宏变量:“llccccc”。“l”的个数是由字符变量的个数决定的,而“c”的个数是由数字变量的个数来决定的。如何实现?
Don't get lost in technical details. What is the big picture?

板凳
456852 发表于 2011-1-15 18:49:56
data have;
input v1-v9;
cards;
1 1 1 1 1 1 1 1 1
;
run;
proc contents data=have out=out noprint;run;
data _null_;
set out end=eof;
if eof then call symput ('num',varnum);
run;
%put #
data c;
c='c';
do i=1 to #
output;
end;
run;
proc sql noprint;select c into:c separated by '' from c;quit;
%put &c;

仅供参考
已有 1 人评分学术水平 热心指数 信用等级 收起 理由
BraveMadMan + 1 + 1 + 1 多谢精彩程序

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

报纸
456852 发表于 2011-1-15 18:58:10
data have;
input v1 $ v2 $ v3 $ v4-v6 v7 $ v8-v10;
cards;
a b c 1 1 1 d 1 1 1
;
run;
proc contents data=have out=out noprint;run;
data var1 var2;
set out;
if type=1 then output var1;
else output var2;
run;
data var1;
set var1 end=eof;
n=_n_;
if eof then call symput ('numn',n);
run;
data var2;
set var2 end=eof;
n=_n_;
if eof then call symput ('numc',n);
run;
%put numn=&numn numc=&numc;
data c;
var='c';
do i=1 to &numn;
output;
end;
run;
data l;
var='l';
do i=1 to &numc;
output;
end;
run;
data t;
set l c;
run;
proc sql noprint;select var into:t separated by '' from t;quit;
%put &t;

仅供参考
已有 1 人评分学术水平 热心指数 信用等级 收起 理由
BraveMadMan + 1 + 1 + 1 多谢!

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

地板
456852 发表于 2011-1-15 19:49:17
hopewell 发表于 2011-1-15 19:15
  1. data have;
  2.     input v1 $ v2-v6 v7 $;
  3. cards;
  4. 1 1 1 1 1 1 1
  5. ;
  6. proc sql noprint;
  7.     select case type
  8.                 when 'char' then 'l'
  9.                 else 'c'
  10.            end into :want separated by ''
  11.         from sashelp.vcolumn
  12.         where libname='WORK' and memname='HAVE';
  13. quit;
  14. %put NOTE: *** &want ***;
复制代码
你这段似乎有问题,出来的是'lcccccl', 不是'llccccc'。

7
soporaeternus 发表于 2011-1-15 21:35:05
  1. data have;
  2.     input v1 $ v2-v6 v7 $ ;
  3. cards;
  4. 1 1 1 1 1 1 1
  5. ;
  6. run;

  7. data _null_;
  8.         set have;
  9.         array _n _numeric_;
  10.         array _c _character_;
  11.         call symputx("want",compress(repeat("l",dim(_c)-1)||repeat("c",dim(_n)-1)));
  12.         stop;
  13. run;
  14. %put &want;
复制代码
不忌讳NOTE和WARNING的话这样写
否则将两个dim按是否为0分开处理
已有 1 人评分学术水平 热心指数 信用等级 收起 理由
BraveMadMan + 1 + 1 + 1 多谢精彩程序

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

Let them be hard, but never unjust

8
elek.me 发表于 2011-1-15 22:02:39
  1. data have;
  2.         input v1-v7 v8 $;
  3. cards;
  4. 1 1 1 1 1 1 1 2
  5. ;
  6. run;


  7. /* 不分类  */
  8. data _null_;
  9.         length num $ 32767;
  10.         retain num "";
  11.         set sashelp.vcolumn;
  12.         by memname notsorted;
  13.         if upcase(libname)="WORK" and upcase(memname)="HAVE" then num=cats(num,"c");
  14.         if last.memname then call symputx ("want",num);
  15. run;

  16. %put &want.;


  17. /* 分类  */
  18. data _null_;
  19.         length num char $ 32767;
  20.         retain num char "";
  21.         set sashelp.vcolumn;
  22.         by memname notsorted;
  23.         if upcase(libname)="WORK" and upcase(memname)="HAVE" then do;
  24.                 typetmp=ifc(type="char","l","c");
  25.                 if type="num" then num=cats(num,typetmp);
  26.                 else char=cats(char,typetmp);
  27.         end;
  28.         if last.memname then call symputx ("want",cats(char,num));
  29. run;

  30. %put &want.;
复制代码
已有 1 人评分学术水平 热心指数 信用等级 收起 理由
BraveMadMan + 1 + 1 + 1 多谢精彩程序

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

我的博客: http://elek.me/sas
联系我: http://about.me/elek

9
elek.me 发表于 2011-1-15 22:28:01
456852 发表于 2011-1-15 19:49
hopewell 发表于 2011-1-15 19:15
  1. data have;
  2.     input v1 $ v2-v6 v7 $;
  3. cards;
  4. 1 1 1 1 1 1 1
  5. ;
  6. proc sql noprint;
  7.     select case type
  8.                 when 'char' then 'l'
  9.                 else 'c'
  10.            end into :want separated by ''
  11.         from sashelp.vcolumn
  12.         where libname='WORK' and memname='HAVE';
  13. quit;
  14. %put NOTE: *** &want ***;
复制代码
你这段似乎有问题,出来的是'lcccccl', 不是'llccccc'。
  1. proc sql noprint;
  2.     select case type
  3.                 when 'char' then 'l'
  4.                 else 'c'
  5.            end into :want separated by ''
  6.         from sashelp.vcolumn
  7.         where libname='WORK' and memname='HAVE'
  8.                 order by type asc;
  9. quit;
  10. %put NOTE: *** &want ***;
复制代码
已有 1 人评分热心指数 收起 理由
BraveMadMan + 1 多谢

总评分: 热心指数 + 1   查看全部评分

我的博客: http://elek.me/sas
联系我: http://about.me/elek

10
BraveMadMan 发表于 2011-1-16 01:31:04
向各位高手致敬了!
Don't get lost in technical details. What is the big picture?

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

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