Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
检查sas数据集是否已排序_Sas - Fatal编程技术网

检查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

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


我知道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
和view
sashelp。vtable
的列
sorttype
(以及相关的字典表)。最佳方法取决于您的用例。也许您可以提供您的问题的更多细节和细节。我澄清了您的一些请求(基于您的第一句话),如果这是错误的,请编辑并进一步澄清。可以使用
proc contents
和view
sashelp.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选项表示否。此链接对于此讨论非常有用