代码之家  ›  专栏  ›  技术社区  ›  Allan Bowe

如何在SAS宏变量中引用控制字符(如CRLF)

sas
  •  3
  • Allan Bowe  · 技术社区  · 6 年前

    我需要在宏变量中搜索控制字符(如LF)。

    data _null_;
      length start mactest  $10;
      start='blah' !! '0A'x !! 'blah';
      call symputx('mactest',start);
      mactest=symget('mactest');
      finish1=find(start,'0A'x);
      finish2=find(start,byte(10));
      finish3=find(start,'
    ');
    put finish1= finish2= finish3=;
    run;
    
    %put whereisit? %sysfunc(find(&mactest,'0A'x));
    %put no, really? %sysfunc(find(&mactest,%sysfunc(byte(10))));
    %put do I really need to do this? %sysfunc(find(&mactest,%str(
    )));
    

    log result

    ^^我可以通过在键盘上添加回车来得到结果,但非常奇怪的是,根据输入的是data step还是macro(我使用的是macbook、studio、9.4和firefox),结果会有所不同。

    编辑 -根据@FriedEgg和@Stu的反馈,可以使用 qsysfunc()

    data _null_;
      length lf $10;
      lf='bl ah' !! '0A'x !! 'blah';
      call symputx('lf',lf);
    run;
    /* returns 3 but should return 6 */
    %put lf=%sysfunc(find(&lf,%qsysfunc(inputc(0A,$hex.))));
    
    2 回复  |  直到 6 年前
        1
  •  3
  •   FriedEgg    6 年前

    一旦字符串 mactest lf 输入 find \x20 这就是为什么你会看到这些结果。我能想到的最好的解决方案是将问题尽可能远离SAS宏BS。。。

    proc fcmp outlib=work.func.macro;
      function symgetz(mvar $) $;
          dsid = open('sashelp.vmacro(where=(name='!!quote(upcase(strip(mvar)))!!'))');
            rc = fetch(dsid);
            return (getvarc(dsid, varnum(dsid, 'value')));
      endsub;
    
      function prxmatchz(prx $,mvar $);
          return (prxmatch(prx,symgetz(mvar)));
      endsub;
    quit;
    
    options cmplib=work.func;
    
    data _null_;
      test='bl ah' !! '0A'x !! 'blah';
      call symput('test',test);
    run;
    
    %put cr=%sysfunc(prxmatchz(/\x0A/,test));
    
        2
  •  2
  •   Stu Sztukowski    6 年前

    inputc %qsysfunc 而不是 %sysfunc 因为回车是一个特殊字符,宏编译器将忽略它。

    %put hereitis! %sysfunc(find(&mactest,%qsysfunc(inputc(0A, $hex.) ) ) );