%macro VDmot(datainit=,dataout=,var=,Prefvar=FG,iff=,mots=,Recol=Non,Majuscul=OUI,Accents=OUI,Ecran=Oui,anafac=NON); %window Accueil #1 @1 " Macro de création de variables comptant a/ le nombre d’occurences et " #2 @1 " b/ la présence/absence d une ou plusieurs expressions au sein d une variable texte." #4 @1 "Quel est le nom de la table initiale ? (datainit=)" @52 datainit 17 attr=rev_video auto=yes #5 @1 "Quel est le nom de la table de sortie ? (dataout=)" @52 dataout 17 attr=rev_video auto=yes #6 @1 "Quels sont les noms des variables texte à analyser ? (var=)" #7 @1 var 80 attr=rev_video auto=yes #8 @1 "Doit-on recoller ces variables (mots coupés en deux) ? (recol=)" @ 65 Recol 3 attr=rev_video auto=yes #9 @1 "Quel préfixe pour les variables dichotomiques ? (prefvar=)" @60 PREFVAR 5 attr=rev_video auto=yes #11 @1 " Les différentes expressions doivent être séparées par un point. " #12 @1 " Ex : TINTIN. MILOU. LE CAPITAINE HADDOCK. LE CHATEAU DE MOULINSART" #13 @1 " La troncature est signalée par une étoile." #14 @1 " Ex : *PRENDRE.FAMIL*.*L AMI* (*l ami*==> l amitie, bel ami, quel amiral...)" #15 @1 " Pour coder plusieurs expressions sous la même variable utiliser égal." #16 @1 " Ex : TRAVAIL=BOULOT=METIER=PROFESSION*. VIVRES=NOURRITURE." #17 @1 "Liste des mots ou des expressions pour faire des variables. (mots=)" #18 @1 mots 200 attr=rev_video auto=yes #20 @1 "Confusion majuscule miniscule : (majuscul=)" @ 46 majuscul 3 attr=rev_video auto=yes #21 @1 "Suppresion des accents : (accents=)" @ 37 accents 3 attr=rev_video auto=yes #22 @1 "Clause restrictive (optionnelle) ? (if ... then do) (iff=)" #23 @1 iff 80 attr=rev_video auto=yes #24 @1 "Anafac sur la base des mots (long) : (anafac=)"@ 48 anafac 4 attr=rev_video auto=yes #25 @1 " Appuyer toujours sur Entree !" ; %if &Ecran=Oui %then %display Accueil; %let prefvar=%upcase(&prefvar); %if %UPCASE(&Majuscul)=OUI %then %do; %let mots=%Upcase(&mots); %end; %let longmot=%length(&mots); %let di=DI; %let point=%str(.); %let egal=%str(=); %if %index(%substr(&mots,&longmot,1),.)=0 %then %do; %let mots=&mots&point; %end; *0.1 Sous-programme pour traiter des suites de variables de type V1-V10 et AA--ZZ; %let tiret1=%str( -); %do %while (%index(&var,&tiret1)>0); %let long=%index(&var,&tiret1); %let var=%qsubstr(&var,1,&long-1)%str(-)%qsubstr(&var,&long+2); %end; %let tiret2=%str(- ); %do %while (%index(&var,&tiret2)>0); %let long=%index(&var,&tiret2); %let var=%qsubstr(&var,1,&long-1)%str(-)%qsubstr(&var,&long+2); %end; %if %index(&var,--)>0 %then %do; proc contents data=&datainit noprint; run; %end; %do %while (%index(&var,--)>0); %let i=1; %do %while(%index(%scan(&var,&i,%str( )),--)=0); %let i=%eval(&i+1); %end; %let long2=%length(%scan(&var,&i,%str( ))); %let Vd=%scan(&var,&i); %let long=%index(&var,&vd); %let Vf=%scan(&var,&i+1); %local z; %local zz; %let z=%sysfunc(open(&datainit)); %let posd=%sysfunc(varnum(&z,&vd)); %let posf=%sysfunc(varnum(&z,&vf)); %let j=%eval(&posd+1); %let blanc=%str( ); %let ttevar=&vd&blanc; %do %while (&j<&posf); %let vj=%sysfunc(varname(&z,&j)); %let ttevar=&ttevar&vj&blanc; %let j=%eval(&j+1); %end; %let ttevar=&ttevar&vf; %let zz=%sysfunc(close(&z)); %let var=%qsubstr(&var,1,&long-1)%str(&ttevar)%qsubstr(&var,&long+&long2); %end; %do %while (%index(&var,-)>0); %let i=1; %do %while(%index(%scan(&var,&i,%str( )),-)=0); %let i=%eval(&i+1); %end; %let long2=%length(%scan(&var,&i,%str( ))); %let Vd=%scan(&var,&i); %let long=%index(&var,&vd); %let Vf=%scan(&var,&i+1); %let k=%length(&Vd); %do %while(%verify(%substr(&vd,&k),0123456789)=0); %let posd=%substr(&vd,&k); %let k=%eval(&k-1); %end; %let k=%length(&Vf); %do %while(%verify(%substr(&vf,&k),0123456789)=0); %let posf=%substr(&vf,&k); %let k=%eval(&k-1); %end; %let j=%eval(&posd+1); %let blanc=%str( ); %let ttevar=&vd&blanc; %do %while (&j<&posf); %let vj=%substr(&vd,1,&k); %let ttevar=&ttevar&vj&j&blanc; %let j=%eval(&j+1); %end; %let ttevar=&ttevar&vf; %let var=%qsubstr(&var,1,&long-1)%str(&ttevar)%qsubstr(&var,&long+&long2); %end; * Suite ; %let posfk=0; %Let l=1; %let longtot=0; %let varo=%scan(&var,&l); %let crecol=1; %if &recol=OUI %then %let crecol=0; %let posfv=%eval(&posfk+1-&crecol); %Let inputv=; %do %while (&varo NE); %let z=%sysfunc(open(&datainit)); %let long=%sysfunc(varlen(&z,%sysfunc(varnum(&z,&varo)))); %let zz=%sysfunc(close(&z)); %let posdv=%eval(&posfv+1+&crecol); %let posfv=%eval(&posfv+&long+&crecol); %let blanc=%str( ); %let inputv= &inputv&varo&blanc&posdv-&posfv&blanc; %let longtot=%eval(&longtot+&long+&crecol); %let l=%eval(&l+1); %let varo=%scan(&var,&l); %end; %put &longtot; %let grosvar=0; %if &longtot>30000 %then %do; %let grosvar=1; %end; %put &grosvar; *1.0 Petites variables; %if %UPCASE(&recol)=OUI %then %do; %let l=1; %let varl=_%substr(%scan(&var,&l),1,4)&l._; %let fusion=_%substr(%scan(&var,&l),1,4)&l._; %let l=%eval(&l+1); %let varl=_%substr(%scan(&var,&l),1,4)&l._; %let varil=%scan(&var,&l); %do %while (&varil NE); %let fusion=&fusion%str( !! )_%substr(%scan(&var,&l),1,4)&l._; %let l=%eval(&l+1); %let varl=_%substr(%scan(&var,&l),1,4)&l._; %let varil=%scan(&var,&l); %end; %end; %else %do; %let l=1; %let varl=_%substr(%scan(&var,&l),1,4)&l._; %let fusion=_%substr(%scan(&var,&l),1,4)&l._; %let l=%eval(&l+1); %let varl=_%substr(%scan(&var,&l),1,4)&l._; %let varil=%scan(&var,&l); %do %while (&varil NE); %let fusion=&fusion%str( !! " " !!)_%substr(%scan(&var,&l),1,4)&l._; %let l=%eval(&l+1); %let varl=_%substr(%scan(&var,&l),1,4)&l._; %let varil=%scan(&var,&l); %end; %end; %let fusion=" " !! &fusion !! " "; data &dataout; set &datainit; %put %str(data &dataout; set &datainit;); %if &iff NE %then %do; %let if=(&iff); if &iff then do; %put %str(if &iff then do;); %end; %Let l=1; %let varo=%scan(&var,&l); %let varl=_%substr(%scan(&var,&l),1,4)&l._; %do %while (&varo NE); %let z=%sysfunc(open(&datainit)); %let long=%sysfunc(varlen(&z,%sysfunc(varnum(&z,&varo)))); %let zz=%sysfunc(close(&z)); length &varl $&long; %put %str(length &varl $&long;); &varl=&varo; %put %str(&varl=&varo;); %if &Accents=OUI %then %do; &varl=translate(&varl,"eeeeaaauuuiiooycEEEEAAAUUUIIOOC", "éèêëàâäùûüîïôöÿçÉÈÊËÀÂÄÙÜÛÎÏÔÖÇ"); %put %str(&varl=translate(&varl,"eeeeaaauuuiiooycEEEEAAAUUUIIOOC","éèêëàâäùûüîïôöÿçÉÈÊËÀÂÄÙÜÛÎÏÔÖÇ");); %put %str(*Suppression des accents;); %end; %if %upcase(&MAjuscul)=OUI %then %do; &varl=Upcase(&varl); %put %str(&varl=Upcase(&varl);); %end; %let diacrit="%nrquote(""''.´,;:!?/-`+*$^()&<>)"; &varl=translate(&varl," ",&diacrit); %put %str(&varl=translate(&varl," ",&diacrit);); drop &varl; %put %str(drop &varl;); %let l=%eval(&l+1); %let varo=%scan(&var,&l); %let varl=_%substr(%scan(&var,&l),1,4)&l._; %end; %let nbvar=%eval(&l-1); %Let compte=1; %let listmot=&mots; %do %while (%quote(&listmot) NE) ; %let nomvar=&prefvar&compte; %let nomvardi=&prefvar&di&compte; %let nnomvar=N&prefvar&compte; %let long=%length(&listmot); %let k=%index(&listmot,.); %let k1=%eval(&k-1); %let k2=%eval(&k+1); %let k3=%eval(&long-&k); %let formfin=; %let listmot2=%substr(&listmot,1,&k1)&egal; %let compteb=1; %let ou=%str( + ); %do %while (%quote(&listmot2) NE); %let long2=%length(&listmot2); %let kb=%index(&listmot2,=); %let kb1=%eval(&kb-1); %let kb2=%eval(&kb+1); %let kb3=%eval(&long2-&kb); %let expr=%substr(&listmot2,1,&kb1); %if &compteb=1 %then %do; %let lab=&expr; %end; %let k4=%length(&expr); %let etoile=%str(*); %if %index(&expr,&etoile) NE 1 %then %do; %if %index(&expr,&etoile) NE &K4 %then %do; %let exprb=%str(" &expr "); %end; %else %do; %let k5=%eval(&k4-1); %let expr2=%substr(&expr,1,&k5); %let exprb=%str(" &expr2"); %end; %end; %else %if %index(&expr,&etoile)=1 %then %do; %let k6=&k4-1; %if %index(%substr(&expr,2,&k4),&etoile) =&k6 %then %do; %let k5=%eval(&k4-2); %let expr2=%substr(&expr,2,&k5); %let exprb=%str("&expr2"); %end; %else %do; %let k5=%eval(&k4-1); %let expr2=%substr(&expr,2,&k5); %let exprb=%str("&expr2 "); %end; %end; %if &grosvar=0 %then %do; %let formfi=%str(count(&fusion%str(,)&exprb.)); %end; %else %do; %if %upcase(&recol)=OUI %then %do; %let jonc=%str(!!); %end; %else %do; %let jonc=%str(!! " " !!); %end; %Let l=1; %let n=2; %let varl=_%substr(%scan(&var,&l),1,4)&l._; %let varn=_%substr(%scan(&var,&n),1,4)&n._; %let varf=_%substr(%scan(&var,&nbvar),1,4)&nbvar._; %let varo=%scan(&var,&n); %let form=; %do %while (&varo NE); %let base=%str(count(" " !! &varl&jonc&varn%str(,)&exprb.))); %let oubase=&base&ou; %let form=&form&oubase; %let l=%eval(&l+1); %let n=%eval(&n+1); %let varl=_%substr(%scan(&var,&l),1,4)&l._; %let varn=_%substr(%scan(&var,&n),1,4)&n._; %let varo=%scan(&var,&n); %end; %let fin=%str(count(&varl%str(,)&exprb.)); %let formfi=&form&fin; %end; %if &compteb=1 %then %do; %let formfin=&formfin&formfi; %end; %else %do; %let formfin=&formfin&ou&formfi; %end; %let listmot2=%substr(&listmot2,&kb2,&kb3); %let compteb=%eval(&compteb+1); %end; &nomvar=(&formfin); %put %str(&nomvar=(&formfin);); &nomvardi=(&nomvar>0); %put %str(&nomvardi=(&nomvar>0);); &nnomvar=1-&nomvardi; %put %str(&nnomvar=1-&nomvardi;); %if &compteb>2 %then %do; %let lab=&lab&egal&point&point&point; %end; label &nomvar="&lab"; %put %str(label &nomvar="&lab";); label &nnomvar="£&lab"; %put %str(label &nnomvar="£&lab";); label &nomvardi="&lab"; %put %str(label &nomvardi="&lab";); %let listmot=%substr(&listmot,&k2,&k3); %let compte=%eval(&compte+1); %end; %if &iff NE %then %do; end; %put %str(end;); %end; %put %str(run;); run; %format : ; proc format; %put %str(proc format;); %Let compte=1; %let listmot=&mots; %do %while (%quote(&listmot) NE) ; %let nomvar=&prefvar&compte; %let nomvardi=&prefvar&di&compte; %let nomvar2=%substr(&nomvar,1,7)_; %let long=%length(&listmot); %let k=%index(&listmot,.); %let k1=%eval(&k-1); %let k2=%eval(&k+1); %let k3=%eval(&long-&k); %let listmot2=%substr(&listmot,1,&k1)&egal; %let compteb=1; %do %while (%quote(&listmot2) NE); %let long2=%length(&listmot2); %let kb=%index(&listmot2,=); %let kb1=%eval(&kb-1); %let kb2=%eval(&kb+1); %let kb3=%eval(&long2-&kb); %let expr=%substr(&listmot2,1,&kb1); %if &compteb=1 %then %do; %let lab=&expr; %end; %let listmot2=%substr(&listmot2,&kb2,&kb3); %let compteb=%eval(&compteb+1); %end; %if &compteb>2 %then %do; %let lab=&lab&egal&point&point&point; %end; value &nomvar2 0="£&lab" 1="&lab"; %put %str(value &nomvar2 0="£&lab" 1="&lab";); %let listmot=%substr(&listmot,&k2,&k3); %let compte=%eval(&compte+1); %end; value PresAbs 0="Absent" 1="Présent"; %put %str(value PresAbs 0="Absent" 1="Présent";); %put %str(run;); run; proc means N SUM MEAN STD MAX; %put %str(proc means N SUM MEAN STD MAX;); %Let compte=1; %let listmot=&mots; %do %while (%quote(&listmot) NE) ; %let nomvar=&prefvar&compte; %let long=%length(&listmot); %let k=%index(&listmot,.); %let k1=%eval(&k-1); %let k2=%eval(&k+1); %let k3=%eval(&long-&k); %let expr=%substr(&listmot,1,&k1); var &nomvar; %put %str(var &nomvar;); %let listmot=%substr(&listmot,&k2,&k3); %let compte=%eval(&compte+1); %end; %put %str(run;); run; proc freq; %put %str(proc freq;); %Let compte=1; %let listmot=&mots; %do %while (%quote(&listmot) NE) ; %let nomvar=&prefvar&compte; %let nomvardi=&prefvar&di&compte; %let long=%length(&listmot); %let k=%index(&listmot,.); %let k1=%eval(&k-1); %let k2=%eval(&k+1); %let k3=%eval(&long-&k); %let expr=%substr(&listmot,1,&k1); tables &nomvardi; %put %str(tables &nomvardi;); %let listmot=%substr(&listmot,&k2,&k3); %let compte=%eval(&compte+1); %end; %Let compte=1; %let listmot=&mots; %do %while (%quote(&listmot) NE) ; %let nomvar=&prefvar&compte; %let nomvardi=&prefvar&di&compte; %let nomvar2=%substr(&nomvar,1,7)_.; %let long=%length(&listmot); %let k=%index(&listmot,.); %let k1=%eval(&k-1); %let k2=%eval(&k+1); %let k3=%eval(&long-&k); %let expr=%substr(&listmot,1,&k1); format &nomvardi &nomvar2; %put %str(format &nomvardi &nomvar2;); %let listmot=%substr(&listmot,&k2,&k3); %let compte=%eval(&compte+1); %end; %put %str(run;); run; %if %upcase(&anafac) NE OUI %then %goto fin; title "Analyse factorielle de correspondances "; %put %str(title "Analyse factorielle de correspondances ";); title2 " du tableau individus*(pres/abs mot1,..,pres/abs motn)"; %put %str(title2 " du tableau individus*(pres/abs mot1,..,pres/abs motn)";); title3 " (instruction VAR)"; %put %str(title3 " (instruction VAR)";); proc corresp data=&dataout out=&varl short dim=4 norow; %put %str(proc corresp data=&dataout out=&varl dim=4 short norow; ); var &prefvar&di.1-&nomvardi N&prefvar.1-&nnomvar; %put %str(&prefvar&di.1-&nomvardi N&prefvar.1-&nnomvar;); %put %str(run;); run; title4 " Axe 1 - Axe 2"; %put %str(title4 " Axe 1 - Axe 2";); title5 " NB : Les variables marquant la non-utilisation des expressions"; %put %str(title5 " NB : Les variables marquant la non-utilisation des expressions";); title6 " (N&prefvar.1-&nnomvar) n ont pas été représentées sur le graphique"; %put %str( title6 " (N&prefvar.1-&nnomvar) n ont pas été représentées sur le graphique";); options ps=120 ls=160; %put %str(options ps=120 ls=160;); PROC PLOT1 DATA=&varl (WHERE=(_TYPE_="VAR" and index(_NAME_,"£")<>1)); %put %str(PROC PLOT1 DATA=&varl (WHERE=(_TYPE_="VAR" and index(_NAME_,"£")<>1));); PLOT DIM2*DIM1$_NAME_/HREF=0 VREF=0 BOX LIST=5; %put %str(PLOT DIM2*DIM1$_NAME_/HREF=0 VREF=0 BOX LIST=5;); LABEL DIM2= axe 2; %put %str(LABEL DIM2= axe 2;); LABEL DIM1= axe 1; %put %str(LABEL DIM1= axe 1;); %put %str(run;); run; title4 " Axe 1 - Axe 3"; %put %str(title4 " Axe 1 - Axe 3";); title5 " NB : Les variables marquant la non-utilisation des expressions"; %put %str(title5 " NB : Les variables marquant la non-utilisation des expressions";); title6 " (N&prefvar.1-&nnomvar) n ont pas été représentées sur le graphique"; %put %str( title6 " (N&prefvar.1-&nnomvar) n ont pas été représentées sur le graphique";); PROC PLOT1 DATA=&varl (WHERE=(_TYPE_="VAR" and index(_NAME_,"£")<>1)); %put %str(PROC PLOT1 DATA=&varl (WHERE=(_TYPE_="VAR" and index(_NAME_,"£")<>1));); PLOT DIM3*DIM1$_NAME_/HREF=0 VREF=0 BOX LIST=5; %put %str(PLOT DIM2*DIM1$_NAME_/HREF=0 VREF=0 BOX LIST=5;); LABEL DIM3= axe 3; %put %str(LABEL DIM3= axe 3;); LABEL DIM1= axe 1; %put %str(LABEL DIM2= axe 1;); %put %str(run;); run; title; %put %str(title); %fin : ; %put %str(**** Le programme était : *********;); %put %nrstr(%VDmot) %str((datainit=&datainit,dataout=&dataout,var=&var,Prefvar=&prefvar,iff=&iff,mots=&mots,Recol=&recol,Majuscul=&majuscul,Accents=&accents,Ecran=&ecran,anafac=&anafac);); %put %str(***********************************;); %put %str(); %put %str(); %put %str(****************************************************************;); %put %str(* C est fini. Des blocs de programme SAS générés par la macro*;); %put %str(* et directement utilisables comme programme SAS se trouvent *;); %put %str(* au-dessus dans la fenêtre Log. *;); %put %str(****************************************************************;); %MEND;