【问题标题】:How to run code (macro?) for all datasets in a lib?如何为库中的所有数据集运行代码(宏?)?
【发布时间】:2018-11-17 09:56:43
【问题描述】:

我尝试通过搜索论坛寻找答案,但没有找到解决方案: 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 文件(需要在数据步骤中以不同的方式进行转换)。所需的输出是与源位于同一目录中的另一个文件,其合适的名称为“cleaned.xlsx”或类似名称。

我分享一些代码:

%let filepath=
\\mynetworkpath\;

%let filname=
tobecleaned.xlsx;

%let file=
&filepath.\&filename;


libname epostimp xlsx "&file.";

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

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

此后,我想将它们导出到同一个 Excel 文件,我想将其命名为 clean.xlsx(在 clean.xlsx 中,我想查看挪威、丹麦、瑞典的表格 - 就像在原始文件中一样)。

问题将是:

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

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

【问题讨论】:

  • 谢谢。希望有人知道一次在所有数据集上运行程序的解决方案。
  • 您是否尝试过制作一个复制/修改一张纸的宏?然后,您可以使用 proc 内容或其他工具将工作表列表获取到数据集中,并使用 call execute() 为每个工作表生成一个宏调用。
  • 谢谢!我会试试你的建议!

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


【解决方案1】:

我相信这基本上就是您正在寻找的。请记住,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);

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-09-29
    • 2020-03-05
    • 1970-01-01
    • 2013-09-06
    • 1970-01-01
    • 2012-08-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多