sas 将 table 插入 html 电子邮件
sas insert table into html email
是否可以遍历 table 的记录来填充 html 电子邮件而不重复电子邮件的开头和结尾?
在这个例子中,我收到一封包含 5 table 行的邮件(因为 WORK.MyEmailTable
是 table 的 5 条记录,并且 set
在数据步骤):
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;
我希望有 1 table 行,共 5 行。
不知道有没有办法在数据步骤中使用set
时递归地put
防止邮件的开头和结尾。
(如果不清楚,请告诉我,我会更新。)
谢谢,
您可以使用 _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
,这样您就可以清楚地看到它们是如何工作的。
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
,该变量在数据集的最后一条记录上为真;否则数据步骤将提前终止(在实际达到您的最终陈述之前)。您还需要 stop
告诉它不要返回到开始 - 否则它会放置一个新的开始部分,然后在它到达 set
时立即终止。 (试试看。)
do _n_=1 by 1 until (eof);
是一种特定于 SAS 的增量循环使用方式;例如,它类似于 c/c++ for (_n_=1; !eof; _n_++)
- 它允许您有一个自动递增的 do 循环,同时有一个单独的、不相关的停止条件。
是否可以遍历 table 的记录来填充 html 电子邮件而不重复电子邮件的开头和结尾?
在这个例子中,我收到一封包含 5 table 行的邮件(因为 WORK.MyEmailTable
是 table 的 5 条记录,并且 set
在数据步骤):
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;
我希望有 1 table 行,共 5 行。
不知道有没有办法在数据步骤中使用set
时递归地put
防止邮件的开头和结尾。
(如果不清楚,请告诉我,我会更新。)
谢谢,
您可以使用 _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
,这样您就可以清楚地看到它们是如何工作的。
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
,该变量在数据集的最后一条记录上为真;否则数据步骤将提前终止(在实际达到您的最终陈述之前)。您还需要 stop
告诉它不要返回到开始 - 否则它会放置一个新的开始部分,然后在它到达 set
时立即终止。 (试试看。)
do _n_=1 by 1 until (eof);
是一种特定于 SAS 的增量循环使用方式;例如,它类似于 c/c++ for (_n_=1; !eof; _n_++)
- 它允许您有一个自动递增的 do 循环,同时有一个单独的、不相关的停止条件。