I too use the approach of organizing my programs by import -> coding -> reports -> stats -> graphs. To organize, each section and subsection starts with a comment with two asterisks in outline format. Example: ** 1.0 Import source data; ** 1.1 Import Questionnaires; ** 1.2 Import Labs; ... ** 2.0 Recode and transform data; ** 2.1 Collapse categories; ** 2.2 Normalize skewed distributions; I then have a separate program that takes the name of a SAS program as it's input and then prints out the program outline as defined by the text following the double-asterisks. This is simple text parsing, but produces a document that provides a road map to the entire program. It doesn't help with the problem of running specific sections of code. But helps a when you need to understand a program you wrote a long time ago. ...don %macro pgmdoc(fn); filename pgmfile "&fn"; data _pgmdoctemp_; attrib Outline length=$255 format=$145.; infile pgmfile linesize=255; input Outline &; if scan(upcase(Outline),1) ='DATA' then do; Outline=' '||trim(Outline); output; end; else if scan(upcase(Outline),1) ='PROC' then do; Outline=' '||trim(Outline); output; end; else if scan(upcase(Outline),1) ='SET' then do; Outline=' '||trim(Outline); output; end; else if scan(upcase(Outline),1) ='MERGE' then do; Outline=' '||trim(Outline); output; end; else if scan(upcase(Outline),1) ='LIBNAME' then do; Outline=' '||trim(Outline); output; end; else if substr(upcase(Outline),1,4)='%LET' then do; Outline=' '||substr(Outline,1,length(outline)); output; end; else if substr(upcase(Outline),1,8)='%INCLUDE' then do; Outline=' '||substr(Outline,1,length(outline)); output; end; else if substr(Outline,1,3)='** ' then do; Outline=trim(substr(Outline,4,length(Outline)));output; end; run; title 'SAS Program Documenter'; title2 "&fn"; proc print data=_pgmdoctemp_ noobs; var Outline; run; %mend;
... View more