从SAS中的字符串中删除单引号

时间:2015-10-12 21:50:19

标签: sas sas-macro

我需要使用单引号读取字符串,而不使用宏retrieve_context中的引号。

在调用宏时,用户可以使用单引号或不带引号来调用它,如下所示:

%retrieve_context('american%s choice', work.phone_conv, '01OCT2015'd, '12OCT2015'd)
%retrieve_context(american%s choice, work.phone_conv, '01OCT2015'd, '12OCT2015'd)

如何在没有单引号的情况下读取宏中的第一个参数?

我试过了%conv_quote = unquote(%str(&conv_quote)),但它没有用。

2 个答案:

答案 0 :(得分:5)

您遇到了宏和数据步骤语言之间的差异之一。

在宏中,有一个“引用”的概念,因此有%unquote宏函数。但这并不是指传统的"'字符;宏引用是一个单独的东西,并没有真正的引用字符[在某些情况下有一些类型的字符用于这方面,但它们更像是占位符]。它们来自%str%nrstr%quote等函数,它们会对宏变量中的某些内容进行标记,以便在它们出现之前不会对它们进行解析。

在大多数情况下,宏语言并不真正关注'"个字符,除非在某些解析上下文中标识带引号的字符串,而必须这样做事情在逻辑上有效。因此,%unquote对引号没有任何作用;他们被简单地视为常规角色。

相反,您需要调用数据步骤函数来删除它们(或其他一些东西,但所有这些都更复杂,例如使用%substr%index的各种组合。这是使用%sysfunc完成的,如下所示:

%let newvar = %sysfunc(dequote(oldvar));

Dequote()是数据步骤函数,其功能与%unquote基本相同,但对于正常引号字符("')。根据您的最终用途,您可能需要做更多的事情;汤姆涵盖了其中几种可能性。

答案 1 :(得分:3)

如果用户为您的宏提供可能包含或不包含外引号的值,则可以使用DEQUOTE()函数删除引号,然后将它们添加回您需要的位置。因此,如果您的宏被定义为具有以下参数:

%macro retrieve_context(name,indata,start,stop);

然后,如果要在数据步骤中使用NAME的值,可以使用:

name = dequote(symget('name'));

如果要使用该值生成WHERE子句,则可以使用%SYSFUNC()宏函数调用DEQUOTE()函数。所以像这样:

where name = %sysfunc(quote(%qsysfunc(dequote(%superq(name)))))

如果您的用户实际上是用%代替单引号传递字符串,那么您应该做的第一件事就是用单引号替换百分数。但请确保引用结果宏,否则最终可能会出现不平衡的报价。

%let name=%qsysfunc(translate(&name,"'","%"));