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