楼主: 小鳄鱼a
2360 14

求助帖子 [推广有奖]

11
farmman60 发表于 2014-10-15 05:22:16
小鳄鱼a 发表于 2014-10-14 23:19
这个只是从字符串的层面调用吧,我是第一步把字符串当做一个宏变量,第二部然后再把该字符串里面的字符当 ...
  1. %macro genfact(index);
  2. %let i=1;
  3. %do %while(%scan(&index,&i,%str(,)) ne );
  4. %let Nindex=%scan(&index,&i,%str(,));
  5.    %put &nindex;
  6.     %let j=1;
  7.        %do %while(%scan(&nindex,&j,%str( ())) ne );
  8.        %let Nindex1=%scan(&nindex,&j,%str( ()));
  9.           %put &Nindex1;
  10.         %let j=%eval(&j+1);
  11.            %end;
  12. %let i=%eval(&i+1);
  13. %end;
  14. %mend;

  15. %genfact(index=%quote((fratio54 fratio5b4 analystz10b mrsquare3b),
  16. (analystz10b mrsquare3b cashvot14 cashvot1b4 gsvot54 turnr3 cashvot14 cashvot1b4 gsvot54 turnr3 profit54),
  17. (cashvot1b4 gsvot54 turnr3 cashvot14 cashvot1b4 gsvot54 turnr3 profit54)));
复制代码

12
farmman60 发表于 2014-10-15 07:10:31
  1. This is better?


  2. %macro genfact(index=);
  3. %let i=1;
  4. %do %while(%scan(&index,&i,%str(())) ne );
  5. %let Nindex=%scan(&index,&i,%str(()));
  6.    %put &nindex;
  7.     %let nindex=%quote(&nindex);
  8.      %let j=1;
  9.        %do %while(%scan(&nindex,&j,%str(,)) ne);
  10.        %let Nindex1=%scan(&nindex,&j,%str(,));
  11.           %put &Nindex1;
  12.            %let j=%eval(&j+1);
  13.         %end;
  14. %let i=%eval(&i+1);
  15. %end;
  16. %mend;


  17. %genfact(index=%quote((fratio54,fratio5b4,analystz10b,mrsquare3b),
  18. (analystz10b,mrsquare3b,cashvot14,cashvot1b4,gsvot54,turnr3 cashvot14,cashvot1b4,gsvot54,turnr3 ,profit54),
  19. (cashvot1b4,gsvot54,turnr3 cashvot14,cashvot1b4,gsvot54,turnr3 ,profit54)));
复制代码

13
playmore 发表于 2014-10-15 08:32:39
我总结你的问题是:有一大串字符串,然后要依次得到里面的每一个子字符串?

如果没理解错的话,我的解决方法是:首先,用空格分隔子字符串,不要用逗号,否则会很麻烦,当然非用不可的话没办法,但是能改就先改,以后遇到问题就麻烦了;然后,用我下面的宏
  1. %macro SeparateString(InputString,OutputString,Delimiter);
  2. /**********************************************************************/
  3. /* 此宏用于将含有一组单词的字符串拆分为一个个的单词,并将这些单词依次 */
  4. /* 存放于一系列宏变量之中。注意,字符串中单词的定义为由字母、数字和下 */
  5. /* 下划线组成的一个整体,而分隔符可以为除字母、数字、下划线以及逗号之 */
  6. /* 外的其他任意字符。其中,InputString是所选的字符串;OutputString是  */
  7. /* 输出的字符串前缀,不需要加最后的下划线;Delimiter是原始字符串中的  */
  8. /* 分隔符。注意,可选的Delimiter如下所示:                            */
  9. /*      空格:默认设置,' '                                           */
  10. /*      逗号:','                                                     */
  11. /*      制表:'09'x                                                   */
  12. /*      其他符号:'*'、'|'等                                          */
  13. /*                                                                    */
  14. /* 最终得到的是一组单词的宏变量&OutputString._Var1,&OutputString.Var2 */
  15. /* 等以及字符串所含单词数量的宏变量&OutputString._Num。               */
  16. /*                                                                    */
  17. /*                                      Created on 2014.3.13          */
  18. /*                                      Modified on 2014.3.13         */
  19. /**********************************************************************/

  20. /* 检查Delimiter的合法性 */
  21. %if &Delimiter EQ %STR() %then %let Delimiter=' ';


  22. data SS_temp;
  23.         Str="&InputString";
  24. run;

  25. data SS_temp;
  26.         set SS_temp;
  27.         Words=0;
  28.         do while(SCAN(Str,Words+1,&Delimiter) NE "");
  29.                 Words+1;
  30.         end;
  31. run;

  32. %global &OutputString._Num;

  33. proc sql noprint;
  34.         select Words into :&OutputString._Num from SS_Temp;
  35. quit;

  36. %do SS_i=1 %to &&&OutputString._Num;
  37.         %global &OutputString._Var&SS_i;
  38.         %let &OutputString._Var&SS_i.=%SYSFUNC(SCAN(&InputString,&SS_i,&Delimiter));
  39. %end;

  40. /* 去除&OutputString._Num前后的空格 */
  41. %let &OutputString._Num=%SYSFUNC(TRIM(&&&OutputString._Num));

  42. /* 删除不必要的表格 */
  43. proc delete data=SS_temp;
  44. run;

  45. %mend;


  46. %macro Demo();

  47. %let InputString=12 -24;
  48. %let OutputString=a;
  49. %let Delimiter=' ';
  50. %SeparateString(&InputString,&OutputString,&Delimiter);

  51. %put &a_Num;
  52. %put &a_Var2;

  53. %mend;
复制代码
已有 1 人评分论坛币 学术水平 热心指数 信用等级 收起 理由
小鳄鱼a + 5 + 1 + 1 + 1 谢谢

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

14
小鳄鱼a 发表于 2014-10-15 15:43:42
farmman60 发表于 2014-10-15 07:10
宏变量是不区分大小写的吗

15
小鳄鱼a 发表于 2014-10-17 10:14:04
farmman60 发表于 2014-10-15 07:10
能否讲一下两个do while 的区别   主要是不明白%str在这里的作用  ,谢谢

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

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