我有一个包含100个sas数据集的文件夹。我需要创建一个新表,它有两列(数据集名称,已排序/未排序)。
我知道proc内容可用于检查排序条件,但有没有办法以编程方式对所有100个数据集进行检查并将结果返回到单个表中?
答案 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*/
这显然会非常缓慢,并且它也会为索引但未排序的数据集返回误报,但在功能上,大多数用途都没有什么区别。