检查sas数据集是否已排序
我有一个文件夹,其中有100个sas数据集。我需要创建一个新表,它有两列(数据集名称,排序/未排序)检查sas数据集是否已排序,sas,Sas,我有一个文件夹,其中有100个sas数据集。我需要创建一个新表,它有两列(数据集名称,排序/未排序) 我知道proc内容可用于检查排序条件,但有没有办法通过编程对所有100个数据集进行检查,并在单个表中返回结果?使用DICTIONARY.TABLES,这相当简单 proc sql; create table sorted_tables as select memname, sorttype from dictionary.tables where libname='M
我知道proc内容可用于检查排序条件,但有没有办法通过编程对所有100个数据集进行检查,并在单个表中返回结果?使用DICTIONARY.TABLES,这相当简单
proc sql;
create table sorted_tables as
select memname, sorttype
from dictionary.tables
where libname='MYLIB'
;
quit;
这基本上是PROC内容的编程版本,允许您访问相同的信息。如果需要更多信息,请参阅本主题
“S”表示已排序,“SK”表示已排序的nodupkey。可能还有其他值,我不确定所有值。使用DICTIONARY.TABLES,这相当简单
proc sql;
create table sorted_tables as
select memname, sorttype
from dictionary.tables
where libname='MYLIB'
;
quit;
这基本上是PROC内容的编程版本,允许您访问相同的信息。如果需要更多信息,请参阅本主题
“S”表示已排序,“SK”表示已排序的nodupkey。可能还有其他值,我不确定所有值。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*/
这显然会非常缓慢,而且对于索引但未排序的数据集,它也会返回误报,但在大多数情况下,功能上几乎没有区别。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*/
这显然会非常缓慢,而且对于索引但未排序的数据集,它也会返回误报,但在大多数情况下功能上几乎没有差异。可以使用
proc contents
和viewsashelp。vtable
的列sorttype
(以及相关的字典表)。最佳方法取决于您的用例。也许您可以提供您的问题的更多细节和细节。我澄清了您的一些请求(基于您的第一句话),如果这是错误的,请编辑并进一步澄清。可以使用proc contents
和viewsashelp.vtable
的列sorttype
(以及相关的字典表)。最佳方法取决于您的用例。也许你可以提供一些关于你的问题的进一步细节和细节。我澄清了你的一些请求(基于你的第一句话),如果这是错误的,请编辑并进一步澄清。这只有在SAS“知道”数据集已排序的情况下才有效。如果您使用id=1到10的10条记录创建一个数据集,SAS将不知道它已“排序”,因为它从未经过PROC SORT或类似操作。还可以通过在未实际排序的数据集上使用sortedby选项来愚弄SAS。PROC内容将显示sorted=yes。字典表显示sorttype='W'。因此,答案部分取决于“排序”的含义。排序在SAS中有特殊含义。如果SAS无法确定数据集是否已排序,则无法确定。它可能按特定的顺序排列,但除非元数据反映它,否则不会对其进行排序。如果使用了SORTEDBY选项,则VALIDATED选项表示否。此链接对于本次讨论非常有用。仅当SAS“知道”数据集已排序时,此链接才有效。如果您使用id=1到10的10条记录创建一个数据集,SAS将不知道它已“排序”,因为它从未经过PROC SORT或类似操作。还可以通过在未实际排序的数据集上使用sortedby选项来愚弄SAS。PROC内容将显示sorted=yes。字典表显示sorttype='W'。因此,答案部分取决于“排序”的含义。排序在SAS中有特殊含义。如果SAS无法确定数据集是否已排序,则无法确定。它可能按特定的顺序排列,但除非元数据反映它,否则不会对其进行排序。如果使用了SORTEDBY选项,则VALIDATED选项表示否。此链接对于此讨论非常有用