楼主: jingju11
4057 13

no solution? [推广有奖]

已卖:379份资源

院士

30%

还不是VIP/贵宾

-

威望
3
论坛币
10965 个
通用积分
5.0866
学术水平
452 点
热心指数
463 点
信用等级
347 点
经验
76409 点
帖子
1937
精华
1
在线时间
3428 小时
注册时间
2009-5-22
最后登录
2020-1-26

楼主
jingju11 发表于 2015-1-21 11:56:30 |AI写论文

+2 论坛币
k人 参与回答

经管之家送您一份

应届毕业生专属福利!

求职就业群
赵安豆老师微信:zhaoandou666

经管之家联合CDA

送您一个全额奖学金名额~ !

感谢您参与论坛问题回答

经管之家送您两个论坛币!

+2 论坛币

%let       lenx=40;

%let       string=notfunc  (abc);

%let       string2=%qsysfunc(substrn(&string,1,&lenx));

程序错误。

关于如何解决这个问题,我个人认为,很可能无解。

错误的原因:’notfunc (abc)’ 很可能被当成方程解析。比如,如果 %let         string=notfunc*  (abc); 错误不再出现。因为此时的&string很明显不是方程定义的形式。

如果利用substr(),这个错误并不存在。在某种情况下,substrn(x,1,k)==substr(x,1,min(k,length(x))when k >0. 也就是说,substrn()很可能自身对函数的输入做出估计,然后进行运算。还是substrn()设计的缺陷。但是令人费解的是%let     string=2 (abc); 仍然导致错误。


请教过我SAS补习班的老师,也没有给出很好的答案。也认为无有好的办法。

大家的看法如何?如何解决这个问题呢?真的是没有解决方法吗?


京剧


二维码

扫码加我 拉你入群

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

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

关键词:Solution solutio Soluti SOL UTI solution

沙发
pobel 在职认证  发表于 2015-1-21 12:51:27
SAS 9.1.3没有显示错误:

1    %let       lenx=40;
2    %let       string=notfunc  (abc);
3    %let       string2=%qsysfunc(substrn(&string,1,&lenx));
4    %put &String2;
notfunc  (abc)

藤椅
jingju11 发表于 2015-1-21 13:00:53
pobel 发表于 2015-1-21 12:51
SAS 9.1.3没有显示错误:

1    %let       lenx=40;
    SAS/QC 12.3 (maintenance)

NOTE: Additional host information:

X64_7PRO WIN 6.1.7601 Service Pack 1 Workstation

NOTE: SAS initialization used:
      real time           9.40 seconds
      cpu time            1.13 seconds


1    %let       lenx=40;
2    %let       string=notfunc  (abc);
3    %let       string2=%qsysfunc(substrn(&string,1,&lenx));
ERROR: Required operator not found in expression: notfunc  (abc)

板凳
pobel 在职认证  发表于 2015-1-21 13:52:46
jingju11 发表于 2015-1-21 13:00
SAS/QC 12.3 (maintenance)

NOTE: Additional host information:
用9.2就有错误了,不过我感觉SAS没有试图把“notfunc  (abc)”当成一个“function”, 而是一个”expression“

152     %let       lenx=40;
153     %let       string=%str(%)nofunc);
154     %let       string2=%qsysfunc(substrn(&string,1,&lenx));
ERROR: Required operator not found in expression: )nofunc

报纸
pobel 在职认证  发表于 2015-1-21 13:57:35
不太清楚问题出在什么地方,好像SAS是需要一个运算符:

164    %let       lenx=40;
165    %let       string=notfunc  (ab+c);
166    %let       string2=%qsysfunc(substrn(&string,1,&lenx));
167    %put String2: &string2;
String2: notfunc  (ab+c)

地板
jingju11 发表于 2015-1-21 14:06:44
pobel 发表于 2015-1-21 13:52
用9.2就有错误了,不过我感觉SAS没有试图把“notfunc  (abc)”当成一个“function”, 而是一个”express ...
Not sure what exactly epression means.

%let string=1+a;
%let string2=%qsysfunc(substrn(&string,1,&lenx));
%put &string2;

SAS does not complain, even 1+a is an awakard expression.

7
jingju11 发表于 2015-1-21 14:10:03
pobel 发表于 2015-1-21 13:57
不太清楚问题出在什么地方,好像SAS是需要一个运算符:

164    %let       lenx=40;
I got what you mean.
Neither a (b) is not a 'good' expression, nor a (b+c).

8
pobel 在职认证  发表于 2015-1-21 14:23:44
jingju11 发表于 2015-1-21 14:06
Not sure what exactly epression means.

%let string=1+a;
Syntax
SUBSTRN(string, position <, length>)  

Arguments

string
specifies a character constant, variable, or expression.
------------------------------------------------------------------------------------------
When using ”%let       string=notfunc  (abc);“, I guess SAS thought "&string" is an "expression", not a constant string.

when using "%let string=1+a;", although there's an operator "+", the macro processor would still treat it as a constant string.

Maybe the key is on the right parenthesis ")", but I don't know why.



  

已有 1 人评分论坛币 学术水平 热心指数 信用等级 收起 理由
jingju11 + 5 + 5 + 5 + 5 精彩帖子

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

9
jingju11 发表于 2015-1-21 14:27:13
anyway, it is weird.

151  %let     string=%str(%(nofunc);%put &string;
(nofunc
152  %let string2=%qsysfunc(substrn(&string,1,&lenx));
153  %put &string2;
nofu

where is the 1st (?

maybe just simply as it is, substrn() is not a GOOD function under macro environment.
JingJU

10
wpfwxn 发表于 2015-1-21 16:09:45
小弟不才,尝试解答一下这个问题!

首先,substr函数和substrn函数的作用机制不一样,参见下例:

%let       lenx = 3;
%let       string = 2*3*4*5*6*7;
%let       string1 = %sysfunc(substr(&string.,1,&lenx));
%let       string2 = %sysfunc(substrn(&string.,1,&lenx));

%put &string1.;
%put &string2.;
   由此可以推断,substr函数发挥作用时,是直接将string的值作为字符串处理了,而substrn函数发挥作用时,并没有将string的值直接当做字符串处理。

其次,宏变量的值是文本,而文本跟字符串不完全一样。比如上例substrn函数表达式中先进行了运算,才进一步转化为了字符串。

再次,表达式%let       string3 = %sysfunc(substrn(notfunc  (abc),1,&lenx)); 也会报错,为什么报错呢?我猜测原因是因为'()'的出现,并且因为表达式前面没有宏函数%sysfunc出现,排除了使用函数的可能性,最终让SAS认为'notfunc’ 和 ‘(abc)'之间需要运算,故报缺少操作符的错误。
已有 2 人评分论坛币 学术水平 热心指数 信用等级 收起 理由
-迷失在红尘中 + 1 + 1 + 1 精彩帖子
jingju11 + 5 + 5 + 5 精彩帖子

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

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

本版微信群
加好友,备注cda
拉您进交流群
GMT+8, 2026-1-9 01:37