sas%str或%bquote希望将半单引号保留在宏变量中

时间:2017-03-01 05:42:11

标签: string sas quotes

使用%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()?

2 个答案:

答案 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)