使用 "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;
到'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;