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

时间:2018-12-11 20:26:27

标签: sas

我需要在宏变量中搜索控制字符(例如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

^^我可以通过从键盘上直接添加一个回车键来获得结果,但是非常奇怪,这取决于是将其输入到数据步骤还是宏(我使用的是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 个答案:

答案 0 :(得分:3)

此功能是怪罪的,一旦将字符串mactestlf送入find,则0回车符或换行符或类似字符将被转换为空格\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));

答案 1 :(得分:2)

使用inputc将其转换为十六进制,并使用%qsysfunc而不是%sysfunc将其括起来,因为回车符是一个特殊字符,它将被宏编译器忽略。

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