如何为lib中的所有数据集运行代码(宏?)?

时间:2018-06-07 13:04:30

标签: loops sas dataset export-to-excel sas-macro

我尝试在没有找到解决方案的情况下搜索论坛找到答案: https://stackoverflow.com/search?page=3&tab=Relevance&q=listing%20over%20datasets%20sas

/* make all letters lower case */
data steg1;
set steg0b;
email = lowcase(email);
run;

/* stripping down email column */
data steg2;
set steg1;
email = strip(email);
run; 

我想在某个库中的所有数据集上运行某个代码(长一个,我发布了它的一部分)(可能循环是正确的方法)。该库是一个包含所有工作表的excel文件(需要以不同的方式在datastep中进行转换)。所需的输出是与原点在同一目录中的另一个文件,其名称为" cleaning.xlsx"或类似的。

我分享一些代码:

%let filepath=
\\mynetworkpath\;

%let filname=
tobecleaned.xlsx;

%let file=
&filepath.\&filename;


libname epostimp xlsx "&file.";

这让我得到了一个名为epostimp的图书馆,在那里我找到了不同的图纸,我们称之为挪威,丹麦,瑞典。

我现在想要为三个数据集执行我的datastep。

此后我想将它们导出到我想称为clean.xlsx的同一个excel文件中(在clean.xlsx中我希望看到挪威,丹麦,瑞典的表 - 就像在原版中一样)。

问题将是:

  • 如何使用我的datastep进行循环
  • 如何将完成数据集重命名为正确的数据集;挪威,丹麦,瑞典
  • 如何将它们导出到名为cleaning.xlsx
  • 的一个excel文件中

很高兴听到一些如何制作它的建议。

1 个答案:

答案 0 :(得分:0)

我相信这实际上是您要寻找的。请记住,EXCEL引擎将创建工作表和指定名称的范围,但这通常无关紧要。

本质上,将两个文件都视为库,一个人可以遍历输入文件(输入库)中的库成员,并在输出文件(输出库)中以相同的名称重新创建它们。

请记住,此代码不是很可靠,如果输出文件已经存在,则会生成错误。可以包括自动删除和创建新文件,但最好还是谨慎一点。另外,如果工作表名称包含空格或特殊字符,这可能会导致迭代出现问题。例如,拥有名为“ Sheet 1”的工作表将导致“ ii”分别遍历“ Sheet”和“ 1”。

%macro loop_over_sheets(in_file, out_file);
    libname in_lib excel "&in_file.";
    libname out_lib excel "&out_file.";

    %local ii ds_name ds_names;

    /*  Get the dataset names. */
    proc sql noprint;
        select  memname into :ds_names separated by ' '
            from dictionary.members
                where upcase(LIBNAME) = 'IN_LIB';
    quit;

    %do ii = 1 %to %sysfunc(countw(&ds_names.));
        %let ds_name = %scan(&ds_names., &ii.);

        data out_lib.&ds_name.;
            set in_lib."&ds_name.$"n;

            /* ... your code here ... */
        run;
    %end;

    libname in_lib clear;
    libname out_lib clear;
%mend loop_over_sheets;

%loop_over_sheets(&file., &filepath.cleaned.xlsx);

最后一行使用示例中给定的file和filepath宏变量。根据需要进行修改。