SAS-将同一数据集导出到多个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

我想根据某个变量将数据集导出到多个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个以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()函数。