我需要同时读取单引号和宏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))
,但没有成功。
发布于 2015-10-12 22:16:46
您将遇到宏和数据步骤语言之间的差异之一。
在宏中,有一个“引号”的概念,因此%unquote
宏函数。但这并不是指传统的"
或'
字符;宏引用是另一回事,没有任何引号字符在某些上下文中使用,但它们更像占位符。它们来自像%str
、%nrstr
和%quote
这样的函数,它们将宏变量中的某些内容标记化,这样它们就不会在预期的情况下被解析。
然而,在大多数情况下,宏语言并不真正注意'
和"
字符,只需要在某些解析上下文中识别引用的字符串,这样做才能使事情逻辑地工作。因此,%unquote
对引号不做任何处理;它们只是作为常规字符处理。
相反,您需要调用一个数据步骤函数来删除它们(或者其他一些事情,但它们都比较复杂,比如使用%substr
和%index
的各种组合)。这是使用%sysfunc
完成的,如下所示:
%let newvar = %sysfunc(dequote(oldvar));
Dequote()
是数据步骤函数,它执行与%unquote
基本相同的功能,但用于正常引号("
、'
)。根据您的最终用途,您可能需要做更多的工作;Tom介绍了这些可能性中的几种。
发布于 2015-10-12 22:08:23
如果用户为宏提供的值可能包括或不包括外部引号,则可以使用DEQUOTE()函数删除这些引号,然后将它们添加到需要的位置。因此,如果宏被定义为具有以下参数:
%macro retrieve_context(name,indata,start,stop);
然后,如果要在数据步骤中使用名称的值,可以使用:
name = dequote(symget('name'));
如果要使用该值生成WHERE子句,则可以使用%SYSFUNC()宏函数调用DEQUOTE()函数。所以就像这样:
where name = %sysfunc(quote(%qsysfunc(dequote(%superq(name)))))
如果您的用户确实是用%
代替单引号传递字符串,那么您应该做的第一件事就是用单引号替换百分比。但一定要保留结果宏的引号,否则可能会出现不平衡的引号。
%let name=%qsysfunc(translate(&name,"'","%"));
https://stackoverflow.com/questions/33090797
复制相似问题