我需要使用单引号读取字符串,而不使用宏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))
,但它没有用。
答案 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,"'","%"));