我有一个示例代码,可以在数据步骤(宏外部)中工作,但是当我尝试将其转换为宏时,该代码不起作用。我尝试了各种类型的方法来实现CALL SYMPUTS,SYSFUNC,LETs等。下面列出的代码是我试图制作为输入T_Test2的宏的代码。
DATA asdhjkl;
SET T_Test2;
IF INPUT(SCAN(COL1, 1, "-"), best.)=0 THEN COL1=SUBSTR(COL1, INDEX(COL1,"-")+1);
string="-00000000000000000000";
DO I = 1 TO 20;
COL1 = TRANWRD(COL1, trim(string), " ");
string = substr(string, 1, length(string)-1);
PUT string;
END;
COL1=COMPRESS(COL1);
RUN;
基本上,我想做的是将另一个字符串(例如65-03)中的“ -0”的子字符串变体并删除03。但是它也更通用,因此如果它是65-003和65- 0003,等等。
答案 0 :(得分:0)
如果您希望将类似65-003
和65-003
的示例的值转换为65-3
,则您的程序太复杂了。您可以将第二部分转换为数字,然后生成字符串。或者,您可以使用正则表达式将连字符(后跟一个或多个零)转换为连字符。
这是这两种方法的数据步骤代码解决方案:
data test;
input have $20. ;
length want1-want2 $20;
want1=catx('-',scan(have,1,'-'),input(scan(have,2,'-'),32.));
want2=prxchange('s/-0*/-/',-1,have);
cards;
65-003
65-0003
;
或者您也可以在宏代码中执行类似的操作以对宏变量的值进行操作。 %eval()
函数使用整数算术评估看起来像表达式的字符串,因此添加+
会使003
看起来像要评估的表达式。
%macro fix1(string);
%scan(&string,1,-)-%eval(+%scan(&string,2,-))
%mend fix1;
%macro fix2(string);
%sysfunc(prxchange(s/-0*/-/,-1,%superq(string)))
%mend fix2;
%put %fix1(65-003);