宏内的SAS子字符串化

时间:2019-05-13 19:33:08

标签: macros sas

我有一个示例代码,可以在数据步骤(宏外部)中工作,但是当我尝试将其转换为宏时,该代码不起作用。我尝试了各种类型的方法来实现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,等等。

1 个答案:

答案 0 :(得分:0)

如果您希望将类似65-00365-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);