SAS编程:Compare结果输出方式介绍

工作中,双侧编程会涉及结果的Compare,目的是为了确认双侧编程结果一致。对于不一致的结果,查明原因后,进行程序更新。

这一过程中,最先处理的是,数据集比较结果不一致如何展示的问题

Compare过程步比较结果,可以通过以下4种方式进行展示:

  1. SAS日志
  2. 自动宏变量SYSINFO的返回值
  3. 过程步的Results输出
  4. 结果输出到数据集

1. SAS日志

当使用WARNINGPRINTALLERROR选项时,Compare过程步会在SAS日志中输出不一致的描述。以ERROR选项为例,演示程序如下:

data base;
  set sashelp.class;
run;

data comp;
  set sashelp.class;

  if _n_ = 1 then height =100;
run;

proc compare base = base comp=comp error;
run;

SAS日志输出结果如下:

Log 1

2. 自动宏变量SYSINFO的返回值

Compare过程步运行结束之后,会在自动宏变量SYSINFO中返回一个值,这个返回值记录了比较结果的信息。在Compare过程步运行之后以及其他过程步运行之前,通过检查SYSINFO的返回值,可以获取不一致的具体描述信息。很多公司Compare的宏程序也是利用SYSINFO宏变量输出比较的结果。

SAS官方文档中,对返回值有具体的描述,Code具体值为2的(n-1)次方,n对应具体描述的位序。(来源:SAS Help Center: Results: PROC COMPARE)

Macro Return Codes

如果在一次比较中,以上16种情形出现不止一个,那么SAS会输出各出现情形对应Code值的求和

举例1,变量值不同:

data base;
  set sashelp.class;
run;

data comp;
  set sashelp.class;

  if _n_ = 1 then height =100;
run;

proc compare base = base comp=comp;
run;

%let comres=&sysinfo.;
%put Compare resulst code: &comres.;

日志输出如下:

Log 2

输出结果为4096,对应第13种情况(2的12次方),A value comparision was unequal

举例2,变量值以及Label不同:

data base;
  set sashelp.class;
run;

data comp;
  set sashelp.class;

  if _n_ = 1 then height =100;
  label weight = "W";
run;

proc compare base = base comp=comp;
run;

%let comres=&sysinfo.;
%put Compare resulst code: &comres.;

日志输出如下:

Log 3

输出结果为4128,4096+32,对应第6和第13种情形,Variable has different labelA value comparison was unequal

关于多种情形如何定位区分的问题,SAS文档中提供了一种二进制匹配确认的方法

%let rc=&sysinfo;
data _null_;
/* 1. Test for data set label */
   if &rc = '1'b then
      put '<<<< Data sets have different labels';
/* 2. Test for data set types */
   if &rc = '1.'b then
      put '<<<< Data set types differ';
/* 3. Test for variable informats */
   if &rc = '1..'b then
      put '<<<< Variable has different informat';
/* 4. Test for variable formats */
   if &rc = '1...'b then
      put '<<<< Variable has different format';
/* 5. Test for length */
   if &rc = '1....'b then
      put '<<<< Variable has different lengths between the base data set 
      and the comparison data set';
/* 6. Test for label */
   if &rc = '1.....'b then
      put '<<<< Variable has different label';
/* 7. Test for base observation */
if &rc = '1......'b then
      put '<<<< Base data set has observation not in comparison data set';
/* 8. Test for comparison observation */
   if &rc = '1.......'b then
      put '<<<< Comparison data set has observation not in base';
/* 9. Test for base BY group */
if &rc = '1........'b then
      put '<<<< Base data set has BY group not in comparison';
/* 10. Test for comparison BY group */
   if &rc = '1.........'b then
      put '<<<< Comparison data set has BY group not in base';
/* 11. Variable in base data set not in compare data set */
   if &rc ='1..........'b then 
      put '<<<< Variable in base data set not found in comparison data set';
/* 12. Comparison data set has variable not in base data set */
   if &rc = '1...........'b then
      put '<<<< Comparison data set has variable not contained in the 
      base data set';
/* 13. Test for values */
   if &rc = '1............'b then
      put '<<<< A value comparison was unequal';
/* 14. Conflicting variable types */
   if &rc ='1.............'b then
      put '<<<< Conflicting variable types between the two data sets 
      being compared';
/* 15. Test for BY variables */
   if &rc = '1..............'b then
      put '<<<< BY variables do not match';
/* 16. Fatal error*/
   if &rc ='1...............'b then
      put '<<<< Fatal error: comparison not done';
run;

上一个Compare过程步返回结果为4128,运行以上代码后,SAS日志显示如下,所有不一致情形都会输出。SAS这样设计很巧妙,每一个返回值对应的情形都能够清晰输出

Log 4

3. 过程步的Results输出

在SAS中运行Compare过程步后,Results页面也会有输出结果的汇总,汇总的内容有以下几种:

  • Data Set Summary
  • Variables Summary
  • Observation Summary
  • Values Comparison Summary
  • Value Comparison Results
  • Table of Summary Statistics
  • Comparison Results for Observations (Using the TRANSPOSE Option)

示例代码:

data base;
  set sashelp.class;
run;

data comp;
  set sashelp.class;

  if _n_ = 1 then height =100;
  label weight = "W";
run;

proc compare base = base comp=comp;
run;

Results页面结果如下:

Results

Results页面中的内容也可以输出到外部文档中:

ods rtf file = "E:\99_Test\Test\Compare_results.rtf";

proc compare base = base comp=comp;
run;

ods rtf close;

结果输出到指定目标文件中:

RTF

外部文件内容截取部分:

RTF 2

关于如何保留或删除特定汇总结果,具体参考SAS官方文档: SAS Help Center: Results: PROC COMPARE

4. 结果输出到数据集(out=选项)

这个方式在之前的文章中介绍过,具体参考SAS编程:分享数据集Compare的小经验,输出的结果数据集为,相比较两个数据集变量值不同的记录。

我常用的选项设置如下:

proc compare base = base comp = comp out=df 
    outbase outcomp outdif outnoequal;
run;

输出数据集结果如下:

Dataset

总结

文章介绍了,SAS中Compare过程步结果输出的4种方式,读者可以结合自己的工作需求,进行“私人定制”。

同时,各家公司Compare宏程序大都也是基于以上几种方式进行输出,希望能够帮助读者理解本公司宏程序运行机制。

感谢阅读, 欢迎关注!
若有疑问,欢迎评论交流!

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 215,874评论 6 498
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,102评论 3 391
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 161,676评论 0 351
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,911评论 1 290
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,937评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,935评论 1 295
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,860评论 3 416
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,660评论 0 271
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,113评论 1 308
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,363评论 2 331
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,506评论 1 346
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,238评论 5 341
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,861评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,486评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,674评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,513评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,426评论 2 352

推荐阅读更多精彩内容