我需要在宏变量中搜索控制字符(例如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(
)));
^^我可以通过从键盘上直接添加一个回车键来获得结果,但是非常奇怪,这取决于是将其输入到数据步骤还是宏(我使用的是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.))));
答案 0 :(得分:3)
此功能是怪罪的,一旦将字符串mactest
或lf
送入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.) ) ) );