LIBNAME S '.';
OPTIONS PS=MAX LS=MAX NOCENTER SASMSTORE=S MSTORED MAUTOSOURCE;
%MACRO M_NUM_2_9(IN_TABLE,OUT_TABLE,V_NAME,START0,STOP0)/STORE;
DATA &OUT_TABLE(KEEP=&V_NAME &V_NAME._&START0._&STOP0. NUM_2_9);
SET &IN_TABLE;
PRX=PRXPARSE("/2|3|4|5|6|7|8|9/");/*2-9中任意一个数字,区别与/[2-9]/*/
LEN=&STOP0.-&START0.+1;
TEXT=SUBSTR(COMPRESS(&V_NAME),&START0.,LEN);
NUM=0;
START=1;
STOP=LENGTH(TEXT);
CALL PRXNEXT(PRX,START,STOP,TEXT,POSITION,LENGTH);
DO WHILE(POSITION>0);
NUM+1;
CALL PRXNEXT(PRX,START,STOP,TEXT,POSITION,LENGTH);
END;
RENAME TEXT=&V_NAME._&START0._&STOP0. NUM=NUM_2_9;
RUN;
%MEND;
1:程序开头包含一个宏程序的加密,执行该部分只需要将生成的sasmacr给他人,别人就可以直接掉包,而看不到源程序
2.正则表达式中prxparse('/[2-9]/') 与 prxparse('/2|3|4|5|6|7|8|9/')区别是,前者识别的2-9的任意一个出现,CALL PRXNEXT()的length是连续出现2-9数字的个数,而后者对应的length是1;
调用案例:
/*案例数据集*/
LIBNAME S '.';
DATA S.TEMP;
INPUT X $40.;
CARDS;
89sksa9axx8zCz0z
Wkc928AES19b1k3nSA3k
jia0ds1FEWjsdc00-
89WsksaF9axx8zz0z
kc92FW819b1k3n3k
jia0WEFds1jsdc00-
;
RUN;
/*调用宏*/
/*LIBNAME S '.'; 定义指向存放宏M_NUM_2_9的sasmacr文件的逻辑库*/
OPTIONS PS=MAX LS=MAX NOCENTER SASMSTORE=S MSTORED MAUTOSOURCE;/*SASMSTORE=S指向存储宏的逻辑库*/
%M_NUM_2_9(S.TEMP,S.RESULT_1_12,X,1,12);
/*参数1:输入数据集
参数1:输出数据集
参数3:处理的变量(一个)
参数4:截取变量的起始位置;
参数5:截取变量的结束位置;
*/