全部版块 我的主页
论坛 数据科学与人工智能 数据分析与数据科学 SAS专版
1541 3
2020-02-29
悬赏 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

 马上下载

二维码

扫码加我 拉你入群

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

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

全部回复
2020-3-3 10:42:53
你可以试试proc sql方法创建宏变量,然后加上trimmed选项
二维码

扫码加我 拉你入群

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

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

2020-3-6 21:41:00
Jia1Zhao 发表于 2020-3-3 10:42
你可以试试proc sql方法创建宏变量,然后加上trimmed选项
非常感谢!sql好使的,但是不太明白为什么symputx在macro里为什么去不了空格
二维码

扫码加我 拉你入群

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

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

2020-3-6 22:20:01
再次查看code后,方法一中应受%syscall set的影响,生成了带空格的宏变量。如下修改的方法1就没问题了
而方法2经简化排查,call set 生成的宏变量确实是带空格的。目前还没发现有可以使用对call set宏变量trim的方法
复制代码

二维码

扫码加我 拉你入群

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

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

相关推荐
栏目导航
热门文章
推荐文章

说点什么

分享

扫码加好友,拉您进群
各岗位、行业、专业交流群