OPTIONS MPRINT; %MACRO listlength(list); %SYSEVALF(%SYSFUNC( COUNTC(%SYSFUNC( COMPBL(&list) ), " ") )+1) %MEND listlength; /* Example: listlength(Here is an example of $ # @ ! & % 5 6); */ /* Example: %MACRO makedatasets(file=, sheets=, getnames=yes); %DO i=1 %TO %listlength(&sheets); %LET sheet=%SYSFUNC(SCANQ(&sheets, &i)); PROC IMPORT DATAFILE=&file OUT= &sheet DBMS=EXCEL REPLACE; SHEET=&sheet; GETNAMES= &getnames; RUN; %END; %MEND makedatasets; %makedatasets(file="G:\SAS Conference 2009\Final Draft\grades.xls", sheets=midterm1 midterm2 final, getnames=yes); */ %MACRO rep(what=, n=); %SYSFUNC( REPEAT(%BQUOTE(&what ) , &n) ); %MEND rep; /* Examples: %rep(what= circle , n=2); %rep(what=% "% " 45 $ "$ " & " &", n=2); */ %MACRO ifoptions(option=, want=YES); %IF %UPCASE(&want) = NO OR %UPCASE(&want) = N %THEN; %ELSE %IF %UPCASE(&want) = YES OR %UPCASE(&want) = Y %THEN %DO; &option %END; %ELSE %DO; %PUT ERROR: &want not identified, must be YES(|Y) or NO(|N); %PUT NOTE: &want has been replaced with YES; %END; %MEND ifoptions; /* Example: %ifoptions(option=REGEQN OVERLAY, want=Y); */ %MACRO Axis(n=, offset=1in, title="Title here", justify=CENTER, height=1.5, angle=90, font=SIMPLEX, color=black, order=d); %IF %SYSFUNC(LOWCASE(&order)) eq d %THEN %DO; AXIS&n OFFSET = (&offset &offset) LABEL = (ANGLE=&angle JUSTIFY=&justify HEIGHT=&height FONT=&font COLOR= &color &title); %END; %ELSE %DO; AXIS&n OFFSET = (&offset &offset) ORDER = (&order) LABEL = (ANGLE=&angle JUSTIFY=&justify HEIGHT=&height FONT=&font COLOR= &color &title); %END; %MEND Axis; /* Example: %Axis(n=2, offset=0.75in, title='1/Temperature(C)', angle=0, color=blue); */ %MACRO createAxes(numOfAxes=2, offsetlist=1in 1in, titlelist="title 1" "title 2", anglelist=0 0, justifylist=CENTER CENTER, heightlist=1.5 1.5, fontlist=arial arial, colorlist=b r, orderlist=d$d); %IF %SYSEVALF(%SYSFUNC(COUNTC(%SYSFUNC(COMPBL(&offsetlist)), " ") )+1)~=&numOfAxes OR %SYSEVALF(%SYSFUNC(COUNTC(%SYSFUNC(COMPBL(&titlelist)), " ") )+1)~==&numOfAxes OR %SYSEVALF(%SYSFUNC(COUNTC(%SYSFUNC(COMPBL(&anglelist)), " ") )+1)~=&numOfAxes OR %SYSEVALF(%SYSFUNC(COUNTC(%SYSFUNC(COMPBL(&justifylist)), " ") )+1)~=&numOfAxes OR %SYSEVALF(%SYSFUNC(COUNTC(%SYSFUNC(COMPBL(&heightlist)), " ") )+1)~=&numOfAxes OR %SYSEVALF(%SYSFUNC(COUNTC(%SYSFUNC(COMPBL(&fontlist)), " ") )+1)~=&numOfAxes OR %SYSEVALF(%SYSFUNC(COUNTC(%SYSFUNC(COMPBL(&colorlist)), " ") )+1)~=&numOfAxes OR %SYSEVALF(%SYSFUNC(COUNTC(%SYSFUNC(COMPBL(&orderlist)), "$") )+1)~=&numOfAxes %THEN %DO; %PUT ERROR: Lists of unequal lengths were detected; %PUT NOTE: Each list must be of equal length; %END; %ELSE %DO i=1 %TO &numOfAxes; %PUT NOTE: Creating AXIS&i; %Axis(n=&i, offset=%SYSFUNC(SCANQ(&offsetlist,&i)), title=%SYSFUNC(SCANQ(&titlelist,&i)), angle=%SYSFUNC(SCANQ(&anglelist,&i)), justify=%SYSFUNC(SCANQ(&justifylist,&i)), height=%SYSFUNC(SCANQ(&heightlist,&i)), font=%SYSFUNC(SCANQ(&fontlist,&i)), color=%SYSFUNC(SCANQ(&colorlist,&i)), order=%SCAN(&orderlist,&i, $) ); %END; %MEND createAxes; /* Example: %createAxes(numOfAxes=2, offsetlist= 1in 2in, titlelist="Put title 1 here" "Put title 2 here", anglelist= 0 0 , justifylist=CENTER LEFT, heightlist=1.5 2.1, fontlist=arial simplex, colorlist=b r, orderlist=10 to 20 by 1$50 to 100 by 5); */ %MACRO n4symbols(data=, symbvar=, nname=_n4symb_, library=WORK, keep=NO, dropcounts=0); %GLOBAL &nname; PROC SORT DATA=&data; BY &symbvar; RUN; PROC FREQ DATA=&data; TABLE &symbvar / OUT=freq_&symbvar NOPRINT; RUN; DATA merge_&data; MERGE &data freq_&symbvar; BY &symbvar; DROP PERCENT; IF count <= &dropcounts THEN DELETE; RUN; PROC FREQ DATA=merge_&data; TABLE &symbvar / OUT=merge_freq_&data NOPRINT; RUN; PROC MEANS DATA=merge_freq_&data (WHERE=(COUNT > &dropcounts)) N NOPRINT; VAR count; OUTPUT OUT=data_&symbvar N=_nsymb_; RUN; DATA _NULL_; SET data_&symbvar; CALL SYMPUT ("&nname", _nsymb_); RUN; %PUT &&&nname; %IF %UPCASE(&keep) = NO OR %UPCASE(&keep)= N %THEN %DO; %PUT WARNING: Temporary data sets from n4symbols will be deleted; PROC DATASETS LIBRARY = WORK NOLIST; DELETE freq_&symbvar merge_&data merge_freq_&data data_&symbvar; RUN; QUIT; %END; %ELSE %IF %UPCASE(&keep) = YES OR %UPCASE(&keep)= Y %THEN %PUT NOTE: Temporary data sets from n4symbols will NOT be deleted; %ELSE %PUT ERROR: expecting YES|Y or NO|N for the KEEP parameter; %MEND n4symbols; /* Example: Data material; INPUT Temp Strength Alloy $; cards; 80 1574 Alloy1 90 1487 Alloy1 100 1200 Alloy1 80 1617 Alloy2 90 1550 Alloy2 100 1475 Alloy2 90 1550 Alloy3 100 1475 Alloy3 ; RUN; %n4symbols(data=material, symbvar=Alloy, nname=n, library=WORK, keep=NO, dropcounts=2); */ %MACRO symb(n=, font=%rep(what=dflt, n=23), val=%rep(what=dot, n=23), color=BLACK BLUE BROWN GREEN ORANGE PINK PURPLE RED VIOLET YELLOW GOLD CHARCOAL GRAY CREAM CYAN LILAC LIME MAGENTA MAROON OLIVE ROSE SALMON STEEL TAN, connect=%rep(what=none, n=23), wd=%rep(what=1, n=23), ht=%rep(what=1, n=23), linetype=%rep(what=1, n=23), repeat=%rep(what=1, n=23) ); %DO k=1 %TO &n; SYMBOL&k %IF %SYSFUNC(LOWCASE(%SYSFUNC(SCANQ(&font, &k)))) ne dflt %THEN %DO; FONT=%SYSFUNC(SCANQ(&font, &k)) VALUE=%SYSFUNC(SCANQ(&val, &k)) COLOR=%SYSFUNC(SCANQ(&color, &k)) INTERPOL=%SYSFUNC(SCANQ(&connect, &k)) WIDTH=%SYSFUNC(SCANQ(&wd, &k)) HEIGHT=%SYSFUNC(SCANQ(&ht, &k)) LINE=%SYSFUNC(SCANQ(&linetype, &k)) REPEAT=%SYSFUNC(SCANQ(&repeat, &k)) ; %END; %ELSE %DO; FONT=, VALUE=%SYSFUNC(SCANQ(&val, &k)) COLOR=%SYSFUNC(SCANQ(&color, &k)) INTERPOL=%SYSFUNC(SCANQ(&connect, &k)) WIDTH=%SYSFUNC(SCANQ(&wd, &k)) HEIGHT=%SYSFUNC(SCANQ(&ht, &k)) LINE=%SYSFUNC(SCANQ(&linetype, &k)) REPEAT=%SYSFUNC(SCANQ(&repeat, &k)) ; %END; %END; %MEND symb; /* Example: %symb(n=2); %symb(n=&n, wd=3.2 3.2, ht=1.2 1.2); */ %MACRO TnF(t1="SAS file name", t2="Plot for dataset ", t3="Title of plot", f1="Data File Name", f2="Job Number", sheet=., t1j=LEFT, t1f=SIMPLEX, t1h=1, t2j=CENTER, t2f=SIMPLEX, t2h=12pt, t3f=SIMPLEX, t3h=12pt, f1j=RIGHT, f1f=SIMPLEX, f1h=1, f2j=LEFT, f2f=SIMPLEX, f2h=1 ); %IF &sheet ~= . %THEN %DO; TITLE1 JUSTIFY=&t1j FONT=&t1f HEIGHT=&t1h &t1; TITLE2 JUSTIFY=&t2j FONT=&t2f HEIGHT=&t2h &t2 JUSTIFY=&t2j FONT=&t3f HEIGHT=&t3h &t3; /* to go to next line the JUSTIFY value must be same as previous */ FOOTNOTE1 JUSTIFY=&f1j FONT=&f1f HEIGHT=&f1h "Data file: " &f1 JUSTIFY=&f1j "Sheet(s): " &sheet ; FOOTNOTE2 JUSTIFY=&f2j FONT=&f2f HEIGHT=&f2h "Job: " &f2 ; %END; %ELSE %DO; TITLE1 JUSTIFY=&t1j FONT=&t1f HEIGHT=&t1h &t1; TITLE2 JUSTIFY=&t2j FONT=&t2f HEIGHT=&t2h &t2; FOOTNOTE1 JUSTIFY=&f1j FONT=&f1f HEIGHT=&f1h "Data file: " &f1 FOOTNOTE2 JUSTIFY=&f2j FONT=&f2f HEIGHT=&f2h "Job: " &f2 ; %END; %MEND TnF; /* Example: %TnF( t1="material.sas", t2="Strength vs Temperature", f1="material.xls", sheet="sheet1", f2="Catalog 2" ); */ %MACRO makedata (file=, sheet=, type_val=_typeval_, length_type=); PROC IMPORT DATAFILE=&file OUT= &sheet DBMS=EXCEL REPLACE; SHEET=&sheet; GETNAMES= YES; USEDATE= YES; SCANTIME= YES; RUN; DATA &sheet; LENGTH &type_val $&length_Type; SET &sheet; &type_val ="&sheet"; RUN; PROC SORT DATA = &sheet; BY &type_val; RUN; %MEND makedata; /* Example: %makedata (file="F:\material.xls", sheet=Alloy1, type_val=Alloy_Type, length_type=6); */ %MACRO combineAll(file=, sheets=, new_var=, new_var_length=, out_data=, keeptemps=no, lib=WORK); %DO i=1 %TO %listlength(&sheets); %LET sheetname=%SYSFUNC(SCANQ(&sheets, &i)); %PUT &i %STR(%listlength(&sheets)) &sheetname; %makedata (file=&file, sheet=&sheetname, type_val=&new_var, length_type=&new_var_length); %END; DATA &out_data; SET &sheets; RUN; %IF %UPCASE(&keeptemps) = NO OR %UPCASE(&keeptemps) = N %THEN %DO; %PUT NOTE: the temporary datasets being delected from the working directory; PROC DATASETS LIBRARY = &lib NOLIST; DELETE &sheets; RUN; QUIT; %END; %ELSE %IF %UPCASE(&keeptemps) = NO OR %UPCASE(&keeptemps) = N %THEN %DO; %PUT NOTE: the temporary datasets will not be delected from the working directory; %END; %ELSE %IF %UPCASE(&keeptemps) ~= NO OR %UPCASE(&keeptemps) ~= N OR %UPCASE(&keeptemps) ~= YES OR %UPCASE(&keeptemps) ~= Y %THEN %DO; %PUT WARNING: expecting YES | Y or NO | N for variable KEEPTEMPS; %PUT NOTE: the temporary datasets will not be delected from the working directory; %END; %ELSE; PROC PRINT; RUN; %MEND combineAll; /* Example: %combineAll(file="F:\material.xls", sheets=Alloy1 Alloy2 Alloy3, new_var= Alloy_Type, new_var_length=6, out_data=Alloy_combined); */ %MACRO makeV2F(data=, vars=, svar=_type_, svar_length=, dropvars=, ddname=, newvar=, new=yes, keeptemps=no, lib=WORK); %PUT %listlength(&vars); DATA %DO i=1 %TO %listlength(&vars); &ddname&i(DROP=&vars) %END; ; LENGTH &svar $ &svar_length; SET &data; DROP &dropvars; %DO j=1 %TO %listlength(&vars); %LET dummy=%SYSFUNC(SCANQ(&vars, &j)); &newvar=&dummy; &svar="&dummy"; OUTPUT &ddname&j; %END; RUN; %IF %UPCASE(&new) = NO OR %UPCASE(&new) = N %THEN %DO; %PUT WARNING: The original dataset %SYSFUNC(UPCASE(&data)) is being replaced; DATA &data; SET %DO i=1 %TO %listlength(&vars); &ddname&i %END; ; RUN; %END; %ELSE %IF %UPCASE(&new) = YES OR %UPCASE(&new) = Y %THEN %DO; %PUT NOTE: all the newly created temporary datasets have been set together in dataset NEW_%SYSFUNC(UPCASE(&data)); DATA new_&data; SET %DO i=1 %TO %listlength(&vars); &ddname&i %END; ; RUN; %END; %ELSE %DO; %PUT ERROR: The parameter NEW must be either YES or NO; %END; %IF %UPCASE(&keeptemps) = NO OR %UPCASE(&keeptemps) = N %THEN %DO; %PUT NOTE: the temporary datasets are being deleted from the &lib library; PROC DATASETS LIBRARY=&lib NOLIST; DELETE %DO i=1 %TO %listlength(&vars); &ddname&i %END; ; RUN; QUIT; %END; %ELSE %IF %UPCASE(&keeptemps) = NO OR %UPCASE(&keeptemps) = N %THEN %DO; %PUT NOTE: the temporary datasets will not be deleted from the &lib library; %END; %ELSE %IF %UPCASE(&keeptemps) ~= NO OR %UPCASE(&keeptemps) ~= N OR %UPCASE(&keeptemps) ~= YES OR %UPCASE(&keeptemps) ~= Y %THEN %DO; %PUT WARNING: expecting YES | Y or NO | N for variable KEEPTEMPS; %PUT NOTE: the temporary datasets will not be deleted from the &lib library; %END; %MEND makeV2F; /* Example: DATA Rupture; INPUT Time X1_temp X2_temp X3_temp; CARDS; 10 81 91 101 20 82 92 102 30 83 93 103 ; RUN; %makeV2F(data=Rupture, vars=X1_temp X2_temp X3_temp, dropvars=, ddname=temporary, newvar=value, new=yes, keeptemps=no, svar=Type, svar_length=7, lib=WORK); */