我正在尝试通过我的sas代码创建自定义文本报告,下面是代码
data have ;
ncandidates=1; ngames=3; controlppt=1; controlgame=2;
ppt1='Abc'; ppt2='Bcd';
infile cards dsd dlm='|';
input (var1-var21) ($);
cards;
1|2|a|1|3|b1|2|a|1|3|b1|2|a|1|3|b1|2|a|1|3|b
1|2|a|1|3|b1|2|a|1|3|b1|2|a|1|3|b1|2|a|1|3|b
;
filename report 'myreport.txt';
data _null_;
file report dsd dlm='|' LRECL=8614;
a='';
put
83*'#'
/ '##### Number of ppts'
/ 83*'#'
/ 'input.Name=' @
;
eof = 0;
do until(eof);
set have end=eof;
If not missing(var1) then
put var1-var10 @@ ;
end;
put a
// 83*'#'
/ '##### Output Data'
/ 83* '#'
// 'output.Name=' @;
eof=0;
do until(eof);
set have ;
If not missing(var11) then
put var11-var20 @@ ;
end;
put '1';
run;
除了最后一个'1'以外,所有内容都被打印到文件中;
第二次执行之后,直到执行块之后什么都没有。
另外,如果我将end=eof
添加到直到块的最后一个操作中,则所有内容都会打印两次。
我们对此有解决方案吗?
答案 0 :(得分:0)
我不确定问题的原因。但是有时候,如果您一次读取一个数据集几次,SAS就会表现得很奇怪。但是第二秒钟~/.bash_profile
使用另一个变量可以解决问题:
set have end=eof2;
答案 1 :(得分:0)
在读取集合的最后一条记录后尝试进行读取时,“普通” DATA步骤停止。这通常发生在DATA步骤不可或缺的隐式循环中。当您在结束数据检查时显式地遍历一个集合时,不会发生超出范围的读取尝试,因此不会隐式结束该步骤。
仅当到达数据结尾时才更改eof标志。如果不在数据末尾,则不会将其设置为0-eof标志就是循环开始时的状态。因此,如果将该标志重新用于后续循环,则需要将其重置。
* 'top' is logged twice;
* the data step ends when the second implicit iteration tries to read past eof of the first set;
data _null_;
put 'top';
do until (eof);
set sashelp.class(obs=2) end=eof;
put name=;
end;
eof = 0; * reset flag;
do until (eof);
set sashelp.class(where=(name=:'J')) end=eof;
put name=;
end;
run;
* 'top' is logged once;
* the data step ends when the stop is reached at the bottom;
data _null_;
put 'top';
do until (eof);
set sashelp.class(obs=2) end=eof;
put name=;
end;
eof = 0;
do until (eof);
set sashelp.class(where=(name=:'J')) end=eof;
put name=;
end;
run;