检查是否对sas数据集进行了排序

时间:2015-03-12 11:47:04

标签: sas

我有一个包含100个sas数据集的文件夹。我需要创建一个新表,它有两列(数据集名称,已排序/未排序)。

我知道proc内容可用于检查排序条件,但有没有办法以编程方式对所有100个数据集进行检查并将结果返回到单个表中?

2 个答案:

答案 0 :(得分:5)

使用DICTIONARY.TABLES,这很简单。

proc sql;
  create table sorted_tables as
    select memname, sorttype
    from dictionary.tables
    where libname='MYLIB'
  ;
quit;

这基本上是PROC CONTENTS的程序化版本,可让您访问相同的信息。如果您需要更多信息,请参阅主题Kirk Lafler's excellent paper

“S”表示已排序,“SK”表示已排序nodupkey。可能还有其他值,我不确定所有这些值。

答案 1 :(得分:0)

Proc contents / dictionary.tables并不总是讲述完整的故事。有时数据集可能处于排序状态,而元数据不反映这一点,例如,如果它们是在未排序的情况下按排序顺序生成的,或者是已排序数据集的子集。我写了一个小例子来演示如何发生这种情况:

proc datasets lib = work memtype = data kill;
    run;
quit;

data  example                     /*False negative - sorted by name, but no sort metadata present*/
      example2(sortedby = weight) /*Flagged as W - false positive based on user-supplied metadata*/
      example3(sortedby = name)   /*Flagged as W - correct value based on user-supplied metadata*/
      example4                    /*Flagged as S - sorted*/
      example5                    /*Flagged as SK - sorted with no duplicate key values*/
      example6                    /*Flagged as SR - sorted with no duplicate records*/
      example7;                   /*Flagged as SR - sorted with no duplicate records*/
  set sashelp.class;
run;

proc sort data = example4;
  by name;
run;

proc sort data = example5 nodupkey;
  by name;
run;

proc sort data = example6 noduprecs;
  by sex;
run;

proc sort data = example7 nodup;
  by sex;
run;

proc sql;
  create table sorted_tables as
    select libname, memname, sorttype
    from dictionary.tables
    where libname = 'WORK'
   ;
quit;

如果您想确定,一种方法是尝试使用按组处理完全读取每个数据集 - 然后错误将在自动宏变量&SYSERR中显示为非零值如果数据集没有排序:

data _null_;
    set example(keep = name);
    by sex;
run;

%put &SYSERR; /*Returns 1012 - not sorted*/

data _null_;
    set example(keep = name);
    by name;
run;

%put &SYSERR; /*Returns 0 - sorted*/

这显然会非常缓慢,并且它也会为索引但未排序的数据集返回误报,但在功能上,大多数用途都没有什么区别。