sas - SAS 是否有宏来格式化用户编写的 DI 转换的输出?

标签 sas sas-macro sas-dis

使用 SAS Data Integration (DI) Studio 开发 ETL 程序时,您指定的每个转换都有一个简洁的用户界面来指定您创建的数据集(=表)的列及其类型、长度和格式。

当现有的转换不能完成工作并且需要用户编写代码时,您应该尽可能使用点击界面,因为

  • 它支持影响分析和反向影响分析
  • 除非确实需要,否则您的继任者可能不会深入研究 SAS 基本代码
  • 如果他们需要更改列或其格式,他们希望通过更改用户界面中的规范来完成这项工作

幸运的是,SAS 向程序员公开了用户在宏变量中编写的转换的输出格式

所以我经常在用户编写的转换中编写我的代码

%macro format_output(data);
    %do _col = 0 %to  &&&data._col_count - 1; 
        length &&&data._col&_col._name &&&data._col&_col._type&&&data._col&_col._length;
        %if %length(&&&data._col&_col._format) %then %do;
            format &&&data._col&_col._name &&&data._col&_col._format;
        %end;
    %end;
%mend;

data &_OUTPUT1 (keep=&_OUTPUT1_keep);   
    %format_output(_OUTPUT1);
    set &_INPUT1;

    * actua code ;
run;

SAS 是否提供嵌入式宏或类似的东西来做同样的事情?

对于完整性:SAS 公开输出结构的方式看起来像

%let _OUTPUT1 = myLib.myTable;
%let _OUTPUT1_connect = ;
%let _OUTPUT1_engine = ;
%let _OUTPUT1_memtype = DATA;
%let _OUTPUT1_options = %nrquote();
%let _OUTPUT1_alter = %nrquote();
%let _OUTPUT1_path = %nrquote(/myTable_A5E5JYT6.C7000MOL%(WorkTable%));
%let _OUTPUT1_type = 1;
%let _OUTPUT1_label = %nrquote();
/* List of target columns to keep  */ 
%let _OUTPUT1_keep = myID first_item <16 more items> last_item;
%let _OUTPUT1_col_count = 19;
%let _OUTPUT1_col0_name = myID;
%let _OUTPUT1_col0_table = myLib.myTable;
%let _OUTPUT1_col0_length = 8;
%let _OUTPUT1_col0_type = ;
%let _OUTPUT1_col0_format = 13.;
%let _OUTPUT1_col0_informat = 13.;
%let _OUTPUT1_col0_label = %nrquote(my ID);
%let _OUTPUT1_col0_input0 = myID;
%let _OUTPUT1_col0_exp = ;
%let _OUTPUT1_col0_input = myID;
%let _OUTPUT1_col0_input_count = 1;
%let _OUTPUT1_col1_name = first_item;
%let _OUTPUT1_col1_table = myLib.myTable;
%let _OUTPUT1_col1_length = 8;
%let _OUTPUT1_col1_type = $;
%let _OUTPUT1_col1_format = $CHAR8.;
%let _OUTPUT1_col1_informat = $CHAR8.;
%let _OUTPUT1_col1_label = %nrquote(first data item in my table);
%let _OUTPUT1_col1_input0 = first_item;
%let _OUTPUT1_col1_exp = ;
%let _OUTPUT1_col1_input = first_item;
%let _OUTPUT1_col1_input_count = 1;

<documentation about 16 more columns>

%let _OUTPUT1_col18_name = last_item;
%let _OUTPUT1_col18_table = myLib.myTable;
%let _OUTPUT1_col18_length = 16;
%let _OUTPUT1_col18_type = $;
%let _OUTPUT1_col18_format = $16.;
%let _OUTPUT1_col18_informat = $16.;
%let _OUTPUT1_col18_label = %nrquote(last data item in my table);
%let _OUTPUT1_col18_input0 = last_item;
%let _OUTPUT1_col18_exp = ;
%let _OUTPUT1_col18_input = last_item;
%let _OUTPUT1_col18_input_count = 1;
%let _OUTPUT1_filetype = WorkTable;

最佳答案

在 SAS DI Studio 中,用户编写的节点可以有多个输出表,可以从节点图标上直观地看到和访问,通过右键单击表,您可以看到更改表的详细信息(表名称、类型、长度、格式、信息格式等)。请注意我使用的是 4.6 版

在我下面的屏幕截图中,我的用户编写的节点已经有三个输出表。添加第四个: 右键单击节点 选择“添加工作表” 将打开一个新窗口供您输入表格详细信息

在 DI Auto 为您的节点生成的代码中,sas 会将 _OUTPUT1,2,3,4 分配给您的表,因此在您的代码中您可以使用相应的 &Output 来引用它们

User Written Node DI Studio

添加表格后,您可以通过从可视化界面(点击)中选择它们的属性来查看和编辑所有输出表格的详细信息(长度、格式、信息格式)。所以你不需要一个宏。 Table Properties

关于sas - SAS 是否有宏来格式化用户编写的 DI 转换的输出?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49448313/

相关文章:

sas - SAS 中不匹配的引号问题

sql - 在 SAS SQL 中使用宏

string - SAS为宏变量中的所有单词添加前缀

sas - 如何在 proc iml 内有条件地定义宏变量?

sas - 哪个 SAS 版本与 SAS 存储过程版本 2.0 兼容?从版本9开始兼容吗?

SAS:事件发生后创建 'ever' 变量以供后续观察的代码

mysql - 引用其他表查看日期范围内的记录

SAS宏变量变化+数组索引

sas - 如何更改SAS数据集成中列中的数据?