【问题标题】:Is it possible to loop proc contents and produce a table for each entry?是否可以循环 proc 内容并为每个条目生成一个表?
【发布时间】:2017-02-02 10:47:01
【问题描述】:

假设,我通过调用 proc 内容得到以下输出:

Name Type Format
  x    1    DATETIME
  y    2        $

根据我想调用不同宏的格式。假设我有两个宏,%date(var = ) 和 %rest(var = )。最后,我想用名称 x 调用宏 %date,用名称 y 调用宏 %rest。我希望或多或少清楚我要做什么。谢谢!

【问题讨论】:

    标签: macros sas


    【解决方案1】:

    是的,这是可能的,但您通常不会尝试处理来自 PROC CONTENTS 的输出数据集,而是从 PROC CONTENTS 请求输出数据集,然后进一步处理:

    proc contents data=mydata out=mycontents noprint;
    run;
    

    NOPRINT 选项禁止正常打印输出。 MYCONTENTS 数据集将包含 MYDATA 数据集中的每个变量的一行,以及 typelengthformat 等列。然后您可以根据需要进一步处理,调用您的 @ 987654330@ 宏或其他。

    编辑:

    这是一个更完整的程序,展示了如何将result 变量添加到内容数据集,对每种数据类型使用单独的宏。请注意,在此代码中没有特别需要使用宏。

    %macro num_macro();
        result = 'I''m a numeric';
    %mend;
    
    %macro char_macro();
        result = 'I''m a character';
    %mend;
    
    data in;
      attrib datevar length=8 format=date9.;
      attrib charvar length=$ 20;
      attrib numvar length=8;
    run;
    
    proc contents data=in out=contents noprint;
    run;
    
    data contents_with_result;
      length result $ 40;
      set contents (keep = name type);
      if type=1 then do;
        %num_macro();
      end;
      else do;
        %char_macro();
      end;
    run;
    
    proc print;
    run;
    

    这使用两个小宏来封装每种数据类型所需的不同代码,但请注意,这并不是在数据集中的每条记录中调用一次宏 - 当数据步骤为被解析/编译,然后宏生成的代码在输入数据集中的每条记录中执行一次。

    有一些方法可以让输入数据集中的每条记录调用一次宏,但只有在非常特殊的情况下才需要这种方法。如果您想对数据集中已经存在的数据进行一些每条记录的处理,您应该尽可能地使用数据步骤来完成。

    【讨论】:

    • 感谢您的回答。你可以再详细一点吗?你会如何使用我的内容?我不确定在什么环境下我可以根据类型调用宏。谢谢
    • 给猫剥皮的方法有很多,但是像 'data null;设置我的内容;如果 format='date' 然后调用 execute('%date(var=' || name || ');');运行;',例如。您可以查找 CALL EXECUTE 的文档。也可以用更纯粹的宏观方式来完成,这取决于口味。您是想为每个变量生成一次调用,还是只为所有日期变量生成一次 %date 调用,为所有非日期变量生成一次 %rest 调用?
    • 首先,我想在 proc 内容的输出中添加一个列结果。通过根据名称调用两个宏之一来设置列结果的值。你会怎么做?非常感谢您的帮助!
    • 我已经编辑了我的答案以进一步扩展示例代码。不过,现在这已成为一个非常广泛的问题!
    • @克里斯·朗。这很完美。非常感谢您花时间回答我的问题。
    猜你喜欢
    • 2014-07-12
    • 1970-01-01
    • 2023-02-24
    • 1970-01-01
    • 1970-01-01
    • 2015-02-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多