楼主: Cecilia_Xi
1127 3

[有偿编程] 求macro中,使用数据集生成宏变量,要求去掉宏变量取值trailing的空格 [推广有奖]

  • 1关注
  • 1粉丝

硕士生

89%

还不是VIP/贵宾

-

威望
0
论坛币
806 个
通用积分
8.0110
学术水平
10 点
热心指数
9 点
信用等级
6 点
经验
3205 点
帖子
99
精华
0
在线时间
289 小时
注册时间
2019-1-30
最后登录
2022-4-20

10论坛币
【求macro中,使用数据集生成宏变量,要求去掉宏变量取值trailing的空格】
1. 目的:使用macro一次性导入一个excel的多个sheet。尝试了两种方法(方法1:call symputx; 方法2:%syscall set),都遇到了类似的问题:生成的宏变量sheet的值(&sheet的值)无法去掉trailing的空格(按理说call symputx可以去掉空格,不知为何在%macro...%mend中,&sheet取值有trailing空格,不太理解为什么)。
a1.png

2. 具体求,如何在macro中创建可以去掉宏变量取值空格的方法。
当i=1时,&sheet=sheet1(注意:sheet1后不应有trailing的空格)
当i=2时,&sheet=biao2(注意:biao2后不应有trailing的空格)
当i=3时,&sheet=try3(注意:try3后不应有trailing的空格)
当i=4时,&sheet=test4(注意:test4后不应有trailing的空格)

3. 具体code如下:
/*方法1*/
data excel;
    input sheet $9. var $6.;
        datalines;
sheet1    sheet
biao2     sheet
try3      sheet
test4     sheet
finalyeah sheet
;
run;

%macro callset();
        %let dsid=%sysfunc(open(excel));
        %let nobs=%sysfunc(attrn(&dsid, nobs));/*数据库属性*/
        %syscall set(dsid);/*与数据库联系起来,生成的宏变量为该数据库的所有变量名*/

        %do i=1 %to &nobs;
                %let rc=%sysfunc(fetchobs(&dsid, &i));

data _null_;
              set excel;
          where &i=&nobs;
              call symputx(var,sheet);
run;

PROC IMPORT OUT= WORK.a&i
       DATAFILE= "保存路径\multiple_xlsx.xlsx"
            DBMS=EXCEL REPLACE;
     RANGE="&sheet$";
     GETNAMES=YES;
     MIXED=NO;
     SCANTEXT=YES;
     USEDATE=YES;
     SCANTIME=YES;
RUN;

%put &sheet after;

        %end;
        %let dsid=%sysfunc(close(&dsid));
%mend;
%callset();


/*方法2*/
data excel;
    input sheet $9.;
        datalines;
sheet1
biao2  
try3  
test4  
finalyeah
;
run;

%macro callset();
        %let dsid=%sysfunc(open(excel));
        %let nobs=%sysfunc(attrn(&dsid, nobs));/*数据库属性*/
        %syscall set(dsid);/*与数据库联系起来,生成的宏变量为该数据库的所有变量名*/
        %do i=1 %to &nobs;
                %let rc=%sysfunc(fetchobs(&dsid, &i));

  PROC IMPORT OUT= WORK.a&i
       DATAFILE= "保存路径\multiple_xlsx.xlsx"
            DBMS=EXCEL REPLACE;
     RANGE="&sheet$";
     GETNAMES=YES;
     MIXED=NO;
     SCANTEXT=YES;
     USEDATE=YES;
     SCANTIME=YES;
RUN;

%put &sheet after;
        %end;
        %let dsid=%sysfunc(close(&dsid));

%mend;
%callset();



multiple_xlsx.xlsx

12.63 KB

关键词:symputx Macros SAS call set 批量导入
沙发
Jia1Zhao 发表于 2020-3-3 10:42:53 |只看作者 |坛友微信交流群
你可以试试proc sql方法创建宏变量,然后加上trimmed选项

使用道具

藤椅
Cecilia_Xi 在职认证  发表于 2020-3-6 21:41:00 |只看作者 |坛友微信交流群
Jia1Zhao 发表于 2020-3-3 10:42
你可以试试proc sql方法创建宏变量,然后加上trimmed选项
非常感谢!sql好使的,但是不太明白为什么symputx在macro里为什么去不了空格

使用道具

板凳
Cecilia_Xi 在职认证  发表于 2020-3-6 22:20:01 |只看作者 |坛友微信交流群
再次查看code后,方法一中应受%syscall set的影响,生成了带空格的宏变量。如下修改的方法1就没问题了
而方法2经简化排查,call set 生成的宏变量确实是带空格的。目前还没发现有可以使用对call set宏变量trim的方法
  1. /*方法1*/
  2. data excel;
  3.     n=_n_;
  4.     input sheet $9. var $6.;
  5.         datalines;
  6. sheet1    sheet
  7. biao2     sheet
  8. try3      sheet
  9. test4     sheet
  10. finalyeah sheet
  11. ;
  12. run;
  13. %macro callset;
  14.         %let dsid=%sysfunc(open(excel));
  15.         %let nobs=%sysfunc(attrn(&dsid, nobs));/*数据库属性*/
  16.         %do i=1 %to &nobs;

  17. data _null_;
  18.               set excel;
  19.                           where &i=n;
  20.               call symputx(var,sheet);
  21. run;

  22. PROC IMPORT OUT= WORK.a&i
  23.        DATAFILE= "保存路径\multiple_xlsx.xlsx"
  24.             DBMS=EXCEL REPLACE;
  25.      RANGE="&sheet.$";
  26.      GETNAMES=YES;
  27.      MIXED=NO;
  28.      SCANTEXT=YES;
  29.      USEDATE=YES;
  30.      SCANTIME=YES;
  31. RUN;

  32.         %end;
  33.         %let dsid=%sysfunc(close(&dsid));
  34. %mend;
  35. %callset;

  36. /*方法2*/
  37. data excel;
  38.     input sheet $9.;
  39.         datalines;
  40. sheet1
  41. biao2  
  42. try3  
  43. test4  
  44. finalyeah
  45. ;
  46. run;

  47. %macro callset;
  48.         %let dsid=%sysfunc(open(excel));
  49.         %let nobs=%sysfunc(attrn(&dsid, nobs));/*数据库属性*/
  50.         %syscall set(dsid);/*与数据库联系起来,生成的宏变量为该数据库的所有变量名*/
  51.         %do i=1 %to &nobs;

  52.                 %let rc=%sysfunc(fetchobs(&dsid, &i));
  53. %put &sheet after;
  54.         %end;
  55.         %let dsid=%sysfunc(close(&dsid));

  56. %mend;
  57. %callset;
复制代码

使用道具

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

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

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

GMT+8, 2024-5-24 03:13