具有相同变量但属性不同的表的追加

时间:2019-01-24 12:08:13

标签: sas enterprise-guide

我的问题是关于应该具有相同名称/格式/类型/长度变量的两个不同表的追加。

我试图在SAS程序中创建一个步骤,如果具有相同名称的变量的格式/类型/长度不同,则不允许执行该程序。 例如,当在一个表中有一个日期类型为字符串“ dd-mm-yyyy”的日期,在另一个表中有“ yyyy-mm-dd”或“ dd-mm-yyyy hh:mm:ss”时。追加后,基于这些输入表的日常执行未按预期工作。由于格式不同,有时值会丢失或出现乱序。

我尝试使用PROC COMPARE语句,该语句使我可以检查哪些变量具有不同的属性(类型,长度,格式,InFormat和标签)。

proc compare base = SAS-data-set
             compare = SAS-data-set;
run;

但是,我只得到有关变量具有不同属性的信息(列出具有不同属性的常见变量),无法对此做任何事情。

另一方面,我想知道是否有机会使用此信息构建结构化的输出表,以便将其用作控制语句。 创建一个自动任务可以节省很多时间。

一个示例的屏幕截图:

Screenshot of an example

1 个答案:

答案 0 :(得分:0)

您可以使用Proc CONTENTS获取有关数据集变量的信息。对两个数据集都执行此操作,然后可以使用Proc COMPARE创建一个数据集,以通知您变量属性的差异。

data cars1;
  set sashelp.cars (obs=10);
  date = today ();
  format date date9.;
  cars1_only = 1;
  x = 1.458; label x = "x-factor";
run;

data cars2;
  length type $50;
  set sashelp.cars (obs=10);
  format date yymmdd10.;
  cars2_only = 1;
  X = 1.548; label x = "X factor to apply";
run;

proc contents noprint data=cars1 out=cars1_contents;
proc contents noprint data=cars2 out=cars2_contents;
run;

data cars1_contents;
  set cars1_contents;
  upName = upcase(Name);
run;
data cars2_contents;
  set cars2_contents;
  upName = upcase(Name);
run;

proc sort data=cars1_contents; by upName;
proc sort data=cars2_contents; by upName;
run;



proc compare noprint 
  base=cars1_contents 
  compare=cars2_contents 
  outall 
  out=cars_contents_compare (where=(_TYPE_ ne 'PERCENT'))
;

  by upName;
run;

还有一个ODS表可以直接捕获而无需运行Proc CONTENTS,但是捕获不是“数据密集型”

ods output CompareVariables=work.cars_vars;

proc compare base=cars1 compare=cars2;
run;