从SAS中的字符串中删除单引号
removing single quotation marks from a string in SAS
我需要从宏 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))
但是没用。
如果用户为您的宏提供的值可能包含也可能不包含外部引号,那么您可以使用 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,"'","%"));
您 运行 了解宏和数据步骤语言之间的差异之一。
宏中有"quoting"的概念,因此才有了%unquote
宏功能。不过,这并不是指传统的 "
或 '
字符;宏引号是一个单独的东西,实际上没有任何引号字符[在这方面的某些上下文中使用了某种字符,但它们更像是占位符]。它们来自 %str
、%nrstr
和 %quote
等函数,这些函数在宏变量中标记某些内容,这样它们就不会在预期之前被解析。
不过,在大多数情况下,宏语言并不真正关注 '
和 "
字符,除非在某些需要这样做的解析上下文中识别带引号的字符串使事情合乎逻辑。因此,%unquote
对引号没有任何作用;它们被简单地视为常规字符。
相反,您需要调用数据步骤函数来删除它们(或其他一些东西,但它们都更复杂,比如使用 %substr
和 %index
的各种组合) .这是使用 %sysfunc
完成的,像这样:
%let newvar = %sysfunc(dequote(oldvar));
Dequote()
是数据阶跃函数,它执行与 %unquote
大致相同的功能,但用于普通引号字符("
、'
)。根据您的最终用途,您可能需要做更多的事情;汤姆涵盖了其中的几种可能性。
我需要从宏 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))
但是没用。
如果用户为您的宏提供的值可能包含也可能不包含外部引号,那么您可以使用 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,"'","%"));
您 运行 了解宏和数据步骤语言之间的差异之一。
宏中有"quoting"的概念,因此才有了%unquote
宏功能。不过,这并不是指传统的 "
或 '
字符;宏引号是一个单独的东西,实际上没有任何引号字符[在这方面的某些上下文中使用了某种字符,但它们更像是占位符]。它们来自 %str
、%nrstr
和 %quote
等函数,这些函数在宏变量中标记某些内容,这样它们就不会在预期之前被解析。
不过,在大多数情况下,宏语言并不真正关注 '
和 "
字符,除非在某些需要这样做的解析上下文中识别带引号的字符串使事情合乎逻辑。因此,%unquote
对引号没有任何作用;它们被简单地视为常规字符。
相反,您需要调用数据步骤函数来删除它们(或其他一些东西,但它们都更复杂,比如使用 %substr
和 %index
的各种组合) .这是使用 %sysfunc
完成的,像这样:
%let newvar = %sysfunc(dequote(oldvar));
Dequote()
是数据阶跃函数,它执行与 %unquote
大致相同的功能,但用于普通引号字符("
、'
)。根据您的最终用途,您可能需要做更多的事情;汤姆涵盖了其中的几种可能性。