考虑以下sas代码片段:
%macro temp(querystr=);
filename request temp;
data _null_;
file request;
put "<string>&querystr</string>";
run;
%mend temp;
%temp(querystr="term 1" and "term2");
请注意,这段代码将无法编译,因为当编译器替换数据步骤中的querystr时,querystr中的第一个引号将关闭put语句的起始引号。
我想屏蔽查询字符串中的引号,将其转换为有效的xml片段,如:
<string>"term 1" and "term 2"</string>
有没有办法通过正确屏蔽引号将上述行输出到文件?我尝试将%sysfunc(TranWrd())函数与%nrbquote()等掩码函数结合使用,但到目前为止我还没有找到可行的解决方案。任何帮助表示赞赏!
答案 0 :(得分:3)
在datastep中添加一个带“quot”选项的htmlencode,并使用%bquote来屏蔽引号直到宏执行。
%macro temp(querystr=);
filename request temp;
data _null_;
file request;
string = cats('<string>',htmlencode("&querystr",' quot'),'</string>');
put string;
run;
%mend temp;
%temp(querystr=%bquote("term 1" and "term2"));
答案 1 :(得分:2)
只要双引号是平衡的,就可以调用宏。因此,您不需要强制宏用户宏引用参数。您的宏可以为他们执行此操作,如下所示。
%macro temp(querystr=);
filename request temp;
data _null_;
file request;
s = catx(htmlencode("%superq(querystr)","quot"),"<string>","</string>");
l = length(s);
put s $varying. l;
run;
%mend temp;
%temp(querystr="term 1" and "term2");
/* check */
data _null_;
infile request;
input;
put _infile_;
run;
/* on log
<string>"term 1" and "term2"</string>
*/
答案 2 :(得分:1)
尝试以下方法:
options mcompilenote=all;
%macro temp(querystr=);
filename request temp;
data _null_;
file request;
querystr=symget('querystr');
querystr=htmlencode(querystr,'quot');
*putlog querystr $;
string="<string>"!!trim(querystr)!!"</string>";
put string $200.;
*put "<string>&querystr</string>";
run;
%mend temp;
%temp(querystr="term 1" and "term2");
答案 3 :(得分:-2)
只需使用put'foo';代替:
%macro temp(querystr=);
filename request temp;
data _null_;
file request;
put '<string>&querystr</string>';
run;
%mend temp;
%temp(querystr="term 1" and "term2");