楼主: yellowriver
5041 7

[原创博文] 竭诚求高手解一下这道SAS Macro题,不甚感激! [推广有奖]

  • 0关注
  • 4粉丝

VIP

已卖:5081份资源

博士生

38%

还不是VIP/贵宾

-

威望
0
论坛币
10034 个
通用积分
22.8832
学术水平
21 点
热心指数
26 点
信用等级
19 点
经验
3133 点
帖子
164
精华
0
在线时间
170 小时
注册时间
2007-11-4
最后登录
2019-5-18

楼主
yellowriver 发表于 2010-11-2 00:40:52 |AI写论文
100论坛币
能否大致解析一下以下的macro代码?代码每隔一小段稍微给一下点评可以吗?感谢大家!

%macro Glue(InputFile=,InputSheet=);
PROC IMPORT OUT= WORK.Master
DATAFILE= "&inputfile."
   
DBMS=EXCEL REPLACE;

   
SHEET="&inputsheet";

   
GETNAMES=YES;

RUN;


Proc Sort data=master;
  
by order;

run;


Data _null_;
set master;
by order;
call symput('Program'||'_'||strip(put(_N_,8.)),Program);
call symput('Type_of_prog'||'_'||strip(put(_N_,8.)),Type);
call symput('Inputlist'||'_'||strip(put(_N_,8.)),InputList);
call symput ('Location'|| '_'||strip(put(_N_, 8.)),Location);
call symput ('number_of_progs',_N_);
run;
    %local a;
    %do a= 1 %to &number_of_progs. ;
        %include "&&Location_&a." ;
        %if %upcase(&&Type_of_prog_&a.) eq MACRO %then %do;
            %let program=&&Program_&a.;
            %let inputlist=(&&Inputlist_&a);
            %str(%&program. &inputlist.);
        %end;
    %end ;
%mend;


给以上程序用的Sample excel sheet:

              
    Order
   
    Type
   
    Program
   
    InputList
   
    Location
   
   

4


   
    Sas
   
    Initial
   
   
   
    C:\Initial.sas
   
   

5


   
    Macro
   
    Conversion
   
    agg_file=&agg_file,    inputds=otela_data
   
    C:\conversion.sas
   
   

6


   
    Sas
   
    Comprehension
   
   
   
    C:\comprehension.sas
   
   

7


   
    Macro
   
    suppressioncounts
   
    Level=district,
LevelVar=g_district_irn

   
    C:\suppressioncounts.sas
   
  
关键词:Macro CRO acr Mac 求高手

回帖推荐

情迷仲夏夜 发表于3楼  查看完整内容

悬赏金还真不少!我现在可正是愁着帐号里一分全无呢!看上去这个macro程序并不是很难的!不知道如果我解释给你后,你会怎样将那100个论坛币投进我的帐号里?(我注册一个多星期来,回了十几个帖子,得到了59个积分,不知道为什么我现在的帐号里,论坛币还是为零?不是说:10个积分可得一个论坛币,可怎么还看不到我账号有论坛币?不知道版主可不可以关注一下?我的经验积分值要累计到多少才能显示出我有多少论坛币?) 这段Macro我 ...

本帖被以下文库推荐

沙发
hopewell 发表于 2010-11-2 00:40:53
  1. %macro Glue(InputFile=,InputSheet=);
  2.     /*macro glue中定义了2个keyword parameter, inputfile和inputsheet*/
  3.     /*inputfile: 输入的excel全路径*/
  4.     /*inputsheet: 输入的excel文件sheet名*/
  5.     /*proc import导入excel文件为sas dataset master*/
  6.     PROC IMPORT OUT= WORK.Master
  7.         DATAFILE= "&inputfile."
  8.         DBMS=EXCEL REPLACE;
  9.         SHEET="&inputsheet";
  10.         GETNAMES=YES;
  11.     RUN;
  12.     /*按order对master排序*/
  13.     Proc Sort data=master;
  14.         by order;
  15.     run;
  16.     /*用call symput()从data step为每个obs创建5个macro variable*/
  17.     /*N从1至sas dataset的最大观测数*/
  18.     /*1 program_N: 取自dataset variable program的value(程序名,如为macro,则必须是macro-name)*/
  19.     /*2 type_of prog_N: 取自dataset variable type的value(类型:sas language or maroc)*/
  20.     /*3 inputlist_N: 取自dataset variable inputlist的value(parameter list)*/
  21.     /*4 location_N: 取自dataset variable location的value(存储位置)*/
  22.     /*5 number_of_progs_N: 记录master的最大观测数*/
  23.     Data _null_;
  24.         set master;
  25.         by order;
  26.         call symput('Program'||'_'||strip(put(_N_,8.)),Program);
  27.         call symput('Type_of_prog'||'_'||strip(put(_N_,8.)),Type);
  28.         call symput('Inputlist'||'_'||strip(put(_N_,8.)),InputList);
  29.         call symput ('Location'|| '_'||strip(put(_N_, 8.)),Location);
  30.         call symput ('number_of_progs',_N_); /*data step的每次迭代值会被覆盖*/
  31.     run;
  32.     /*声明local macro variable a*/
  33.     %local a;
  34.     /*do loop,从1到master的最大观测数*/
  35.     %do a= 1 %to &number_of_progs. ;
  36.         /*include,读入macro variable location_N指代位置的程序*/
  37.         %include "&&Location_&a.";
  38.         /*当macro variable type_of_prog的值为MACRO时*/
  39.         %if %upcase(&&Type_of_prog_&a.) eq MACRO %then %do;
  40.             /*从macro variable program_N获取macro-name*/
  41.             %let program=&&Program_&a.;
  42.             /*从macro variable inputlist_N获得parameter list,放在括号内*/
  43.             %let inputlist=(&&Inputlist_&a);
  44.             /*调用macro*/
  45.             %str(%&program. &inputlist.);
  46.         %end;
  47.     %end ;
  48. %mend;
复制代码
已有 1 人评分学术水平 热心指数 信用等级 收起 理由
pobel + 1 + 1 + 1 精彩帖子

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

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

藤椅
情迷仲夏夜 发表于 2010-11-2 04:14:52
悬赏金还真不少!我现在可正是愁着帐号里一分全无呢!看上去这个macro程序并不是很难的!不知道如果我解释给你后,你会怎样将那100个论坛币投进我的帐号里?(我注册一个多星期来,回了十几个帖子,得到了59个积分,不知道为什么我现在的帐号里,论坛币还是为零?不是说:10个积分可得一个论坛币,可怎么还看不到我账号有论坛币?不知道版主可不可以关注一下?我的经验积分值要累计到多少才能显示出我有多少论坛币?)
这段Macro我觉得应该还算很容易理解的呀!就是从微软的Excel中从第1行一直读取数据到'number_of_progs',Sample excel sheet中有5个纵列(Order ,Type ,Program, InputList, Location),分别读到SAS中的四个变量(Type_of_prog,Program, InputList, Location)然后写到一个叫Master的SAS文件中,在macro程序中用四句call symput只读取(Type ,Program, InputList, Location,第五句call symput是从SAS的_N_中读取SAS运行时的循环数作为样本的总例数,在这个例子中,一共有5行,因为在proc import中有getnames=yes,SAS会自动将excel表格里的标题读进SAS的文件中),再重新按Order排序!在call 这个%Glue macro时,要给出两个东西:第一,就是要给出Sample excel sheet的地址和文件名,第二,就是要给出Sample excel sheet表格内sheet的名称,一般第一张表就叫Sheet1):
%Glue(C:\data\Excel_sheet.xls,Sheet1);
不知道楼主还有什么不明白,需要更详细解释的呢?

板凳
soporaeternus 发表于 2010-11-2 09:17:52
楼上你的答案是最佳的话,钱就直接打你帐户里了,方便快捷,没有延迟,不收手续费
经验貌似是要换成金币的,而且会有一定的条件

楼上还要补充解释下%local a下面的语句,下面还是有点功能的......
Let them be hard, but never unjust

报纸
hopewell 发表于 2010-11-2 10:15:56
改写了一下
  1. %macro Glue(InputFile=,InputSheet=);
  2.     options nomprint nosymbolgen nomlogic mcompilenote=all;
  3.     libname glue "&inputfile";
  4.     Proc Sort data=glue."&inputsheet.$"n out=master;
  5.         by order;
  6.     run;
  7.     %let dsid=%sysfunc(open(master,i));
  8.     %syscall set(dsid);
  9.     %do i=1 %to %sysfunc(attrn(&dsid,nlobs));
  10.         %let rc=%sysfunc(fetchobs(&dsid,&i));
  11.         %include "&location";
  12.         %if %upcase(&type) eq MACRO %then %&program(&inputlist);
  13.     %end;
  14.     %let rc=%sysfunc(close(&dsid));
  15.     libname glue;
  16. %mend;
  17. %glue(inputfile=d:\test.xls,inputsheet=sheet1)
复制代码
已有 3 人评分学术水平 热心指数 信用等级 收起 理由
sopching + 1 + 1 + 1 学习了。 尤其是那个syscall set。代码优化了相当多啊。
pobel + 1 + 1 + 1 学习
soporaeternus + 1 + 1 + 1 学习啦......

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

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

地板
yellowriver 发表于 2010-11-2 13:34:29
你好!感谢你的回复,因为你楼下答得确实很好,按照版规,我得投给“最佳答案”,谢谢你!


3# 情迷仲夏夜

7
yellowriver 发表于 2010-11-2 13:43:40
hopewell, 谢谢你!我发现我们原来‘认识’呀,哈哈,很开心,给你发站内信了。


5# hopewell

8
tmdxyz 发表于 2010-11-3 08:10:14
楼主,你帖子的标题“不甚感激”,是不是错了?应该是“不胜感激”。

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

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