SAS-将同一数据集导出到多个Excel文件

时间:2020-05-22 05:33:57

标签: 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 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文件。

但是,我能得到的只是制造商姓氏的文件。

您能指出我在这里想念的地方吗?非常感谢!

1 个答案:

答案 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函数指定分隔符,因为我们用空格分隔,但是无论如何,如果您这样做,则在使用扫描的宏版本时,就不需要它周围的引号。