SAS-将同一数据集导出到多个excel文件
我想根据某个变量将数据集导出到多个excel文件:SAS-将同一数据集导出到多个excel文件,sas,Sas,我想根据某个变量将数据集导出到多个excel文件: proc sql; create table try as select distinct make from sashelp.cars; quit; proc sql; create table try2 as select count(make) as aaa from sashelp.cars; quit; data _null_; set try; by make; call
proc sql;
create table try as
select distinct make from sashelp.cars;
quit;
proc sql;
create table try2 as
select count(make) as aaa from sashelp.cars;
quit;
data _null_;
set try;
by make;
call symputx ('make',compress(make,' .'),'g');
run;
data _null_;
set try2;
call symputx('n',aaa);
run;
%macro a;
%do i=1 %to &n;
%let var= %scan(&make,&i,"@");
proc export data=testing (where=(make="&make."))
outfile="C:\Users\&make..xlsx"
dbms=xlsx replace;
sheet="&make." ;
run;
%end;
%mend ;
%a;
我的目标是获取所有38个以maker名称作为文件名的excel文件
然而,我能在这里得到的只是最后一个制造商名称的文件
你能指出我错过了什么地方吗?非常感谢 您的第一个错误是,您计算有品牌的汽车数量,而您应该计算不同品牌的汽车。现在让我也借此机会向您解释sql的into子句,这样您就不再需要那个数据步骤了
proc sql;
select count(distinct make)
into :make_count
from sashelp.cars;
quit;
您可以删除make名称中的空格和点,但最好使用compress(make,,'ka')
一次删除所有非字母字符,其中选项k
表示保留,a
表示字母
您的主要错误是,您认为您在宏变量make
中附加了所有make名称,但您实际上一次又一次地覆盖make
:首先您在它上面写“凯迪拉克”,然后写“雪佛兰”,当您使用它时,它变成了“沃尔沃”。
我可以向您解释如何更正datastep,但相反,我将在语句中向您学习该选项:
proc sql;
select distinct compress(make, '', 'ka')`
into :make_list separated by ' '
from sashelp.cars;
quit;
剩下的很简单
%macro export_by_make;
%do make_nr=1 %to &make_count;
%let make= %scan(&make_list, &make_nr);
proc export data=sashelp.cars (where=(compress(make, '', 'ka')`="&make."))
outfile="C:\Users\&make..xlsx"
dbms=xlsx replace;
sheet="&make." ;
run;
%end;
%mend;
%export_by_make;
请注意,您不需要为
%scan
函数指定分隔符,正如我们用空格分隔的那样,但是无论如何,如果您指定了分隔符,在使用scan的宏版本时,您不需要在其周围加引号。您可以不使用%scan()的默认分隔符的原因是使用一个默认分隔符(空白)和消除另一个默认分隔符出现的组合,!$%&( ) * + , - . / ; < ^在将列表生成到宏变量中时,使用compress()函数。