使用 "IF 0 THEN SET" 时如何抑制无限循环音符

How to suppress infinite loop note when using "IF 0 THEN SET"

到'copy'一个数据集的PDV结构,已经advised到"reference a data set at compile time"使用

if 0 then set <data-set>

例如,

data toBeCopied;
    length var1 $ 4. var2 $ 4. ;
    input var1 $ var2 $;

    datalines;
    this  is
    just  some
    fake  data 
    ;
run;

data copyPDV;
    if 0 then set toBeCopied;

    do var1 = 'cutoff' ;
        do var2 =  'words';
            output;
        end;
    end;    
run;

但是,当您 运行 执行此操作时,日志中会出现以下注释:

NOTE: DATA STEP stopped due to looping.

这是因为数据步永远不会到达 EOF 标记并陷入无限循环,如 Data Set Looping 中所述。 (事实证明,DATA 步识别了这一点并终止了循环,因此日志中出现了 NOTE)。

if 0 then set <data-set> 语句的使用似乎是一种长期的做法,可以追溯到 1987 年。虽然对我来说这似乎很老套,但我想不出另一种方法来产生相同的结果(即复制 PDV 结构),除了手动重述属性要求。允许错误、警告和注释保留在日志中的错误、警告和注释也让我印象深刻。

有没有办法抑制这个注释或者有更好的方法来达到相同的结果(即复制数据集的 PDV 结构)?

如果包含 stop; 语句,如

if 0 then do;
        set toBeCopied;
        stop;
    end;

注意事项仍然存在。

试图将 SET 限制为单个观察似乎也没有效果:

if 0 then set toBeCopied (obs=1);

stop 不需要在 if 0 分支中。该分支永远不会执行。 stop需要执行,在你希望执行停止的地方执行。

data copyPDV;
    if 0 then set toBeCopied;

    do var1 = 'cutoff' ;
        do var2 =  'words';
            output;
        end;
    end;    
    stop;
run;

在您的情况下不要隐藏此注释。这是获取数据集结构的方法。

data class;
   set sashelp.class(obs=0);
run;

proc sql;
   create table class1 like sashelp.class;
quit;

通常 SAS 会在您读取输入时终止数据步。原始数据或 SAS 数据集。例如这个数据步会在第6次执行SET语句并发现没有更多的观察值可读时停止。

data want;
  put _n_=;
  set sashelp.class(obs=5);
run;

为了防止循环,SAS 检查您是否在数据步骤的这个迭代中读取了任何观察结果。如果您没有从任何数据集中读取数据,它不会警告您,这足够聪明。所以这个程序没有得到警告。

data want ;
  do age=10 to 15;
    output;
  end;
run;

但是通过添加该 SET 语句,您触发了检查。您可以通过拥有一个您实际正在读取的数据集来防止警告,以便它在读取超过实际输入数据的末尾时停止。

data want;
  if 0 then set sashelp.class ;
  set my_class;
run;

或者您正在阅读的文件。

data want ;
  if 0 then set sashelp.class ;
  infile 'my_class.csv' dsd firstobs=2 truncover ;
  input (_all_) (:) ;
run;

否则添加STOP语句手动结束数据步。

data want ;
  if 0 then set sashelp.class;
  do age=10 to 15;
   do sex='M','F';
    output;
   end;
  end;
  stop;
run;