1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92
|
data test;
input var1 $ var2 $ var3 $ var4 $;
cards;
a1 a2 a3 a4
b1 b2 b3 b4
c1 c2 c3 c4
c1 c2 c3 c4
;
run;
%MACRO MacroTest(data=,var=,out=);
%LET nb_var=%EVAL(%SYSFUNC(COUNTC(%SYSFUNC(COMPBL(&var)),' '))+1);
DATA &out;
IF 0 THEN SET &data;
%DO I=1 %TO &nb_var;
%LET v&I=%SYSFUNC(SCAN(&var,&i));
%END;
%LET svar=%SYSFUNC(TRANSLATE(&var,","," "));
LENGTH Combine $200. ;
IF _N_ = 1 THEN DO;
%DO I=1 %TO &nb_var ;
DECLARE HASH H&I ;
H&I= _NEW_ HASH();
H&I..DefineKey("&&v&i");
H&I..DefineData("&&v&i");
H&I..DefineDone();
DECLARE Hiter I&I("H&I");
%END;
END;
SET &DATA END=EOF ;
%DO I=1 %TO &nb_var ;
RC&I=H&I..find();IF RC&I^=0 THEN RC&I=H&I..Add() ;
%END;
IF EOF THEN DO;
/*** ajout de la modalité --absence de modalité-- = * ***/
%DO I=1 %TO &nb_var ;
&&v&i=" ";RC&I=H&I..Find();IF RC&I^=0 THEN RC&I=H&I..Add();
%END;
/*** imbrication des iterateurs sur les tableaux associatifs ***/
%DO I=1 %TO &nb_var ;
RCI&I=I&I..First();
DO WHILE (RCI&I=0);
%END;
Combine=CATX(' ', &svar ); /*** création de la combinaison ***/
OUTPUT; /*** sortie de la combinaison **/
%DO I=&nb_var %TO 1 %BY -1 ;
RCI&I=I&I..Next();
END;
%END;
END;
DROP
%DO I=1 %TO &nb_var;
RCI&I &&v&i RC&I
%END;
;
RUN;
%MEND;
%MacroTest(Data=test,var=var1 var2 var3 var4,out=Combine1234);
%MacroTest(Data=test,var= var2 var3 var4,out=Combine234); |
Partager