首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >从SAS中的字符串中删除单引号

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

Stack Overflow用户
提问于 2015-10-12 21:50:19
回答 2查看 8.8K关注 0票数 4

我需要同时读取单引号和宏retrieve_context中的引号。

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

代码语言:javascript
运行
复制
%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)),但没有成功。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-10-12 22:16:46

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

在宏中,有一个“引号”的概念,因此%unquote宏函数。但这并不是指传统的"'字符;宏引用是另一回事,没有任何引号字符在某些上下文中使用,但它们更像占位符。它们来自像%str%nrstr%quote这样的函数,它们将宏变量中的某些内容标记化,这样它们就不会在预期的情况下被解析。

然而,在大多数情况下,宏语言并不真正注意'"字符,只需要在某些解析上下文中识别引用的字符串,这样做才能使事情逻辑地工作。因此,%unquote对引号不做任何处理;它们只是作为常规字符处理。

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

代码语言:javascript
运行
复制
%let newvar = %sysfunc(dequote(oldvar));

Dequote()是数据步骤函数,它执行与%unquote基本相同的功能,但用于正常引号("')。根据您的最终用途,您可能需要做更多的工作;Tom介绍了这些可能性中的几种。

票数 5
EN

Stack Overflow用户

发布于 2015-10-12 22:08:23

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

代码语言:javascript
运行
复制
%macro retrieve_context(name,indata,start,stop);

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

代码语言:javascript
运行
复制
name = dequote(symget('name'));

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

代码语言:javascript
运行
复制
where name = %sysfunc(quote(%qsysfunc(dequote(%superq(name)))))

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

代码语言:javascript
运行
复制
%let name=%qsysfunc(translate(&name,"'","%"));
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33090797

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档