使用%STR时(amy.goodman@yaho.com; bill.goodman@yaho.com; jack.goodman@yaho.com); 这给了我结果: amy.goodman@yaho.com; bill.goodman@yaho.com; jack.goodman@yaho.com 这就是我想要的。这是一个名为& email的宏变量。在任何两封电子邮件之间我需要这个分号,但在最后一封电子邮件之后没有分号 但对于在她的电子邮件地址中有单引号的人,如O' Connor, %str将自动匹配单引号 使用%STR(amy.goodman@yaho.com; bill.goodman@yaho.com; lily.O' Connor@yaho.com)将导致错误。 我怎样才能得到结果 amy.goodman@yaho.com; bill.goodman@yaho.com; lily.O' Connor@yaho.com 通过使用%str或任何其他宏引用函数(如%bquote或其他任何内容)来保持单引号无法匹配?
电子邮件列表是从excel列表导入的,我已经在excel文件中的单引号前面加了%:lily.O%' Connor@yaho.com 我如何获得宏变量和电子邮件。 %str()内的值,即: 的 amy.goodman@yaho.com; bill.goodman@yaho.com; lily.O%' Connor@yaho.com 然后我可以将宏变量放入%str()?
答案 0 :(得分:1)
如果你已经在宏变量中有值,比如从数据步骤通过CALL SYMPUTX()
函数调用或从PROC SQL通过INTO子句,那么你可以使用%SUPERQ()
宏函数来宏引用值。
data _null_;
call symputx('unquoted',"O'Connor@domain.com");
run;
%put Email list = %superq(unquoted);
如果该值已经存在于宏变量中,则%BQUOTE()
函数也可以正常工作。
%put Email list = %bquote(&unquoted);
您甚至可以使用RESOLVE()
函数调用%SUPERQ()
以在创建宏引用后立即使用宏引用重新定义宏变量。因此,如果您有一个带有变量MYTABLE
的数据集EMAIL_LIST
,您可以使用这样的代码从数据中生成一系列单独的宏变量(list1,list2等)。
data _null_;
set mytable ;
length mvar rc $32 ;
mvar = cats('list',_n_);
call symputx(mvar,email_list);
rc = resolve(catx(' ','%let',mvar,'=%superq(',mvar,');'));
run;
第一个示例数据步骤有效,因为字符串文字在外部使用双引号,因此保护了不平衡的单引号。您可以使用%QSYSFUNC()
宏函数调用DEQUOTE()
函数在宏代码中执行相同的操作。请注意,如果值包含双引号字符,则会遇到问题。它们需要转换为两个相邻的双引号。
%put Email list = %qsysfunc(dequote("O'Connor@domain.com"));
答案 1 :(得分:0)
使用%STR,您需要使用%符号标记不匹配的引号。所以试试:
%STR(amy.goodman@yaho.com;bill.goodman@yaho.com;lily.O%'Connor@yaho.com)