全部版块 我的主页
论坛 数据科学与人工智能 数据分析与数据科学 SAS专版
2082 3
2022-05-13
悬赏 100 个论坛币 已解决
以下程序,一个在宏内执行,一个在开放代码中执行,为什么结果不一样,对于宏内我知道可以用%sepurq来获取和开放代码状态下的一样结果,但是它为什么会出现这种情况。还有我想要用fcmp过程步,实现一个函数,其中用到run_macro来获取宏里的一个宏变量值,但是这个宏变量值带有%号,我无论怎样做都无法获取完整的字符串。
data test;
a="90%";
output;
a="50%";
output;

/***************** 开放执行 ***************/
proc sql;
    select a into :temp separated  by "*" from test;
quit;

%put 开放执行 &temp.;

/*********************** 宏里执行 **************/
%macro test;
   
    proc sql;
        select a into :temp separated  by "*" from test;
    quit;
   
    %put 宏内 &temp.;
%mend;

%test;

最佳答案

whymath 查看完整内容

run_macro我用的少,不敢妄言。 第一个问题很有意思,试了几次后有如下发现: 1. 将宏内宏外的%put语句改作:%put 90%*50%;,日志输出为: 宏内:90 宏外:90%*50% 2. 将宏内宏外的%put语句改作:%put 90%;,日志输出为: 宏内:90% 宏外:90% 从现象上来看,似乎宏内的“%*”组合被SAS当成了“宏内注释”,使得“%*50”完全沦为了注释内容。为了验证这一点,我做了如下实验: 3. 将test数据集中的“%”改为“ ...
二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

全部回复
2022-5-13 09:43:38
run_macro我用的少,不敢妄言。
第一个问题很有意思,试了几次后有如下发现:
1. 将宏内宏外的%put语句改作:%put 90%*50%;,日志输出为:
   宏内:90
   宏外:90%*50%
2. 将宏内宏外的%put语句改作:%put 90%;,日志输出为:
   宏内:90%
   宏外:90%
从现象上来看,似乎宏内的“%*”组合被SAS当成了“宏内注释”,使得“%*50”完全沦为了注释内容。为了验证这一点,我做了如下实验:
3. 将test数据集中的“%”改为“#”,此时日志输出为:   宏内:90#*50#
   宏外:90#*50#
4. 将select语句改为:
复制代码
此时日志输出为:
   宏内:90%#50%
   宏外:90%#50%

至此,上述判断:
宏内的“%*”组合被SAS当成了“宏内注释”
被证实。

至此,我解释了现象,但仍不清楚原因。
二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

2022-5-13 11:25:01
更新:
我在帮助文档中找到关于宏注释的描述:
Macro comment statements are not recognized when they are enclosed in quotation marks.
将宏内的输出语句改为:
复制代码

日志输出为:
   宏内:"90%*50%"
   宏外:"90%*50%"

这从侧面印证了题目中的 "%*" 在宏内部确实被当成了宏注释语句。
二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

2022-5-13 11:42:12
whymath 发表于 2022-5-13 11:25
更新:
我在帮助文档中找到关于宏注释的描述:将宏内的输出语句改为:
感谢兄弟,SAS留给我们的字符不多呀。真坑。
二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

栏目导航
热门文章
推荐文章

说点什么

分享

扫码加好友,拉您进群
各岗位、行业、专业交流群