我想基于某个变量将数据集导出到多个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 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个以制造商名称作为文件名的excel文件。
但是,我能得到的只是制造商姓氏的文件。
您能指出我在这里想念的地方吗?非常感谢!
答案 0 :(得分:1)
您的第一个错误是,您计算拥有品牌的汽车数量,而应该计算出与众不同的汽车品牌。现在让我也借此机会向您解释sql的in子句,这样您就不再需要该数据步骤了
proc sql;
select count(distinct make)
into :make_count
from sashelp.cars;
quit;
您可以删除名称中的空格和点,但是最好使用compress(make, '', 'ka')
一次删除所有非字母字符,其中k
代表keep和a
代表字母。
您的主要错误是,您认为您将所有品牌名称都附加到了宏变量make
中,但是您一次又一次地覆盖了make
:首先,您写出“凯迪拉克”,然后是“雪佛兰”,到您使用它时,它就变成了“沃尔沃”。
我可以向您解释如何更正您的数据步骤,但是,相反,我将向您学习一个用于声明的选项:
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
函数指定分隔符,因为我们用空格分隔,但是无论如何,如果您这样做,则在使用扫描的宏版本时,就不需要它周围的引号。