是否可以遍历表格的记录以填充html电子邮件而不重复电子邮件的开头和结尾?
通过这个例子,我得到一个包含5个1行表的邮件(因为if (name.equals(p.getValue().getName()))
是5个记录的表,WORK.MyEmailTable
在数据步骤中创建了一个循环):
set
我希望有一张5行的桌子。
在数据步骤中使用data _null_;
file mymail;
set WORK.MyEmailTable;
put '<html><body><table>';
***loop through all records;
put '<tr>';
put %sysfunc(cats('<td>',var1,'</td>'));
put %sysfunc(cats('<td>',var2,'</td>'));
put %sysfunc(cats('<td>',var3,'</td>'));
put '</tr>';
put '</table></body></html>';
run;
时,我不知道是否有办法阻止邮件的开始和结束递归put
。
(如果不清楚我是否会更新,请告诉我。)
谢谢,
答案 0 :(得分:2)
您可以使用_n_
自动datastep变量在第一次观察时通知您,set
语句选项end=
可以知道您在最后一次观察:
data _null_;
file mymail;
set WORK.MyEmailTable end=eof;
if _n_ eq 1 then do;
put '<html><body><table>';
end;
/*loop trhough all records*/
put '<tr>';
put %sysfunc(cats('<td>','_n_=',n,' eof=',eof,' ',var1,'</td>'));
put %sysfunc(cats('<td>','_n_=',n,' eof=',eof,' ',var2,'</td>'));
put %sysfunc(cats('<td>','_n_=',n,' eof=',eof,' ',var3,'</td>'));
put '</tr>';
if eof then do;
put '</table></body></html>';
end;
run;
我已将值_n_
和eof
添加到输出中,以便您可以清楚地看到它们的工作原理。
答案 1 :(得分:1)
Rob的方法几乎是标准的,但是如果您更喜欢编写显式循环脚本(对于非SAS程序员来说更舒适),还有另一种选择。这将像Rob的回答一样完全 ,并且甚至可以编译成相同的机器代码。
data _null_;
file mymail;
put '<html><body><table>';
do _n_ = 1 by 1 until (eof);
/*loop trhough all records*/
set WORK.MyEmailTable end=eof;
put '<tr>';
put %sysfunc(cats('<td>',var1,'</td>'));
put %sysfunc(cats('<td>',var2,'</td>'));
put %sysfunc(cats('<td>',var3,'</td>'));
put '</tr>';
end;
put '</table></body></html>';
stop;
run;
_n_
这里没有任何特殊意义(就像Rob的回答一样);它被惯例使用,因为这样它确实有效地具有与正常情况相同的含义。
您需要使用end=eof
创建变量eof
,该变量在数据集的最后一条记录中为true;否则数据步骤将提前终止(在实际敲击最终声明之前)。您还需要stop
告诉它不要回到开头 - 否则它会,并且会放置一个新的起始部分,然后在它到达set
时立即终止。 (试试看看。)
do _n_=1 by 1 until (eof);
是使用增量循环的SAS特定方式;它类似于c / c ++ for (_n_=1; !eof; _n_++)
- 它允许你有一个自动递增的do循环,同时有一个单独的,不相关的停止标准。