d*********d 发帖数: 239 | 1 编了个MACRO程序想把 一个字符串 q1 q2 q5-q8 变成 q1#q2#q5-q8
原始程序如下
OPTIONS MPRINT;
OPTIONS SYMBOLGEN;
%MACRO convert(pound);
%DO i = 1 %TO %SYSFUNC(COUNTW(£,%STR( )));
%IF &i = 1 %THEN %LET list = %QSYSFUNC(SCAN(£,&i,%STR( )));
%ELSE %LET list = &list%STR(#)%QSYSFUNC(SCAN(£,&i,%STR( )));
%END;
%MEND convert;
%PUT %convert(q1 q2 q5-q8);
不给最终结果。mprint显示到q1#q2生成了,但不生成最后结果。程序也没出错。
当我把%DO循环改成
%DO i = 1 %TO %EVAL(%SYSFUNC(COUNTW(£,%STR( )))+1);
维持其他不变,就可以得到最终结果。
虽然得到了最终结果,但不明白为什么循环部分要加1.COUNTW结果就是3,循环到3就应
该完成所有的更改了吗?
请大牛们不吝赐教!!
谢谢。 | a****2 发帖数: 6 | 2 小弟拙见哈
在end和mend之间加一句“%put list is &list;” 就可以看到已经convert好了
貌似list每次是resolve上一个循环的结果,所以+1也可以看到,不+1的话看到的是i=2
的list
【在 d*********d 的大作中提到】 : 编了个MACRO程序想把 一个字符串 q1 q2 q5-q8 变成 q1#q2#q5-q8 : 原始程序如下 : OPTIONS MPRINT; : OPTIONS SYMBOLGEN; : %MACRO convert(pound); : %DO i = 1 %TO %SYSFUNC(COUNTW(£,%STR( ))); : %IF &i = 1 %THEN %LET list = %QSYSFUNC(SCAN(£,&i,%STR( ))); : %ELSE %LET list = &list%STR(#)%QSYSFUNC(SCAN(£,&i,%STR( ))); : %END; : %MEND convert;
| d*********d 发帖数: 239 | 3 谢谢,貌似是这样的。感觉像是SAS 的BUG.如果用mprint的话看上去同于一个循环i,
会连续调用两次。不明白SAS为什么不能改一下,如果没啥实际作用的话。
=2
【在 a****2 的大作中提到】 : 小弟拙见哈 : 在end和mend之间加一句“%put list is &list;” 就可以看到已经convert好了 : 貌似list每次是resolve上一个循环的结果,所以+1也可以看到,不+1的话看到的是i=2 : 的list
|
|