楼主: Cecilia_Xi
3873 5

[问答] 单引号vs 双引号在宏变量中的使用 [推广有奖]

  • 1关注
  • 1粉丝

已卖:3份资源

硕士生

89%

还不是VIP/贵宾

-

威望
0
论坛币
806 个
通用积分
8.0110
学术水平
10 点
热心指数
9 点
信用等级
6 点
经验
3205 点
帖子
99
精华
0
在线时间
289 小时
注册时间
2019-1-30
最后登录
2022-4-20

楼主
Cecilia_Xi 在职认证  发表于 2020-3-1 19:19:48 |AI写论文
2论坛币
SAS MACRO中单引号与双引号有啥区别?????下列code用单引号就可以正常读入
  1. /*""中间有空格*/

  2. %let a=year=. and city=" " and country=" " and;
  3. %put &a;

  4. /*此步报错*/
  5. data test;
  6. var="&a.";
  7. run;
  8. 问题:使用双引号,如何将宏变量a的取值正确地读入数据集test中,成为变量var的取值

  9. /*""中间无空格时*/
  10. %let a=year=. and city=""and country="" and;
  11. %put &a;

  12. /*数据集a中var变量的值的第二个引号不见了*/
  13. data test;
  14. var="&a.";
  15. run;
  16. 问题:使用双引号,如何将宏变量a的取值正确地读入数据集test中,成为变量var的取值
复制代码

最佳答案

whymath 查看完整内容

一般的,如引号,括号这两类符号需要“匹配”,这是自然语言的特点,被移植到了程序语言中。 匹配是有规则的。从例1可以看出,双引号从左往右匹配,之后的字符被视为多余的,不是程序预定的语法,因此报错。 有些时候确实需要不匹配的引号,如英文 I don't lie. 含有单个的引号,因此使用双引号包围它时,双引号可以从左向右匹配。若使用单引号,则会在 n 和 t 之间完成匹配,后面的字符便会造成麻烦。 在SAS程序中,有两种 ...
关键词:单引号 双引号 Macro 引号

沙发
whymath 发表于 2020-3-1 19:19:49
一般的,如引号,括号这两类符号需要“匹配”,这是自然语言的特点,被移植到了程序语言中。
匹配是有规则的。从例1可以看出,双引号从左往右匹配,之后的字符被视为多余的,不是程序预定的语法,因此报错。

有些时候确实需要不匹配的引号,如英文 I don't lie. 含有单个的引号,因此使用双引号包围它时,双引号可以从左向右匹配。若使用单引号,则会在 n 和 t 之间完成匹配,后面的字符便会造成麻烦。

在SAS程序中,有两种手段来将不匹配引号(或括号)保存到变量中。一是特殊字符屏蔽函数,二是转义字符。

例2中就是将连写两个双引号识别为转义字符,最终存储在宏变量a中的实际为连写两个双引号中的一个双引号。至于例1,建议使用第一种方法,即特殊字符屏蔽函数,如:
  1. %let a=year=. and city=" " and country=" " and;
  2. %put &a;

  3. data test;
  4. var="%superq(a)";
  5. put var=;
  6. run;
复制代码

结果为:
  1. var=year=. and city=" " and country=" " and
复制代码
已有 1 人评分学术水平 热心指数 信用等级 收起 理由
Cecilia_Xi + 1 + 1 + 1 精彩帖子

总评分: 学术水平 + 1  热心指数 + 1  信用等级 + 1   查看全部评分

藤椅
~武~ 发表于 2020-3-3 09:43:27
个人看法,sas宏本质上是文本替换,替换之后还是要继续执行,不然的话需要使用转义符将其转换为普通字符
已有 1 人评分学术水平 热心指数 信用等级 收起 理由
Cecilia_Xi + 1 + 1 + 1 精彩帖子

总评分: 学术水平 + 1  热心指数 + 1  信用等级 + 1   查看全部评分

板凳
Cecilia_Xi 在职认证  发表于 2020-3-7 15:31:56
whymath 发表于 2020-3-1 19:19
一般的,如引号,括号这两类符号需要“匹配”,这是自然语言的特点,被移植到了程序语言中。
匹配是有规则 ...
再次感谢楼主的回答。今天回过头又看了一下例1,例1的“&a.” 的第一个“与宏取值的第一个“组成一对,宏的" and country="部分取值结成一对,而" and country="这部分前面并没有等号,故报错“期待算术运算符” 2020-03-07_152834.png

报纸
Cecilia_Xi 在职认证  发表于 2020-3-7 21:34:01
whymath 发表于 2020-3-1 19:19
一般的,如引号,括号这两类符号需要“匹配”,这是自然语言的特点,被移植到了程序语言中。
匹配是有规则 ...
【请问大神解答】除了super Q以外,我又用了%quote和%bquote。但是%bquote可以,而%quote会报错(按理他们的差别不是只在对于不匹配的引号或括号不需要使用多增加一个%),不太理解%quote为什么会报错。谢谢大神!
  1. %let a=year=. and city=" " and country=" " and;

  2. data test;
  3. var2="%BQUOTE(&a)"; /*正常工作*/
  4. var1="%QUOTE(&a)";/*会报错*/
  5. run;
复制代码


您需要登录后才可以回帖 登录 | 我要注册

本版微信群
加好友,备注cda
拉您进交流群
GMT+8, 2025-12-22 20:24