Date: Mon, 14 Apr 2003 14:38:26 -0400
Reply-To: Patrice.Bourdages@IAAH.CA
Sender: "SAS(r) Discussion" <SAS-L@LISTSERV.UGA.EDU>
From: Patrice.Bourdages@IAAH.CA
Subject: Re: automatically indent SAS program
Content-Type: text/plain; charset="iso-8859-1"
I don't know of any.... But I'm listening...
I have to work in Visual Basic and have one utility for that language that
does exactly that... Would be nice to have something for SAS as well.
There's always the "manual" mode, in witch you spot the code manually (but
it's a real bugger if you have a very long program).
Hope to hear from other SAS-L'ers as well...
Patrice Bourdages
Information System Analyst
Industrial Alliance, home and car insurance
Phone: (418) 650-4600, extension 3216
-----Message d'origine-----
De : Chenwei Liu [mailto:CLiu@BIOSTAT.BSC.GWU.EDU]
Envoyé : 14 avril, 2003 14:24
À : SAS-L@LISTSERV.UGA.EDU
Objet : automatically indent SAS program
Hello SAS-L,
When I am working on a very old SAS program to which many programers
have made changes, it is very helpful to reformat the program so that it
is easier to read. I am wondering whether any body has used such a tool or
SAS macro to make old SAS programs look better. Or whether is there an
editor having such a function? The following example shows basically what I
need, every line gets automatically indented.
Thanks in advance!
Chenwei Liu
Research Associate/SAS Programmer
The George Washington University Biostatistics Center
6110 Executive Boulevard, Suite 750
Rockville, MD 20852
Phone: (301) 881-9260 ext 7055
Email: Cliu@biostat.bsc.gwu.edu
PART OF THE OLD PROGRAM:
========================
LIBNAME &STUDY.&AUDIT "&STUDY.&AUDIT &WDISK";
LIBNAME &STUDY.MAST "&STUDY.MAST &WDISK";
LIBNAME &STUDY.SAS "&STUDY.SAS &WDISK";
LIBNAME &STUDY "&STUDY &EDISK";
**************************************************;
****** INITIALIZE ALL CUMULATIVE DATASETS ******;
**************************************************;
OPTIONS YEARCUTOFF=1930; ****Y2K CODE IMPLEMENTED 10/13/98;
DATA ERRALL;
DUMMY=1;
OUTPUT;
RUN;
/* ------------------------------------------------------------- */
/* THE ALLDEL DATA SET IS USED TO HOLD FORMS THAT HAVE BEEN */
/* DELETED AND THUS RESOLVING THE EDITS ON THOSE FORMS. */
/* ------------------------------------------------------------- */
%MACRO SETDEL;
DATA ALLDEL;
LENGTH NETWORK SORTER1 SORTER2 8. CENTER 2. FORM $5;
RETAIN NETWORK SORTER1 SORTER2 CENTER . FORM ' ';
STOP;
RUN;
%MEND;
%SETDEL;
DATA ETSDATA;
DUMMY=1;
OUTPUT;
RUN;
********************************************************************;
*** START OF DOIT MACRO - RUNNING OF EDITS BY FORM ***;
*** THE DOIT MACRO LOOPS THROUGH EACH FORM AND PERFORMS EDITS ON ***;
*** ALL OF THE SELECTED FORMS FOR THE SELECTED WEEK RANGE -- ONE ***;
*** WEEK, ALL WEEKS, OR A SET OF CONSECUTIVE WEEKS. ***;
********************************************************************;
%MACRO DOIT(FORM,SORTER1,SORTER2);
DATA EDITDATA;
LENGTH SORTER1 SORTER2 8.;
SET &STUDY.MAST.&FORM;
/* CHECK TO SEE IF WE IGNORE TEST NETWORK DATA */
%IF &NETTST = N %THEN %DO;
WHERE (NETWORK < 10000);
%END;
/* SUBSET ON ONE WEEK OR THE WEEK RANGE IF NOT EDITING ALL DATA */
%IF &ALLWEEKS=N %THEN
%DO;
IF &LOWK<=_BatchNo_<=&HIWK;
%END;;
WKOFFORM = _BatchNo_;
/* ASSIGN THE VALUES OF THE SORTER VARIABLES (IF ANY) TO */
/* THE VARIABLES SORTER1 AND SORTER2 */
%DO Q=1 %TO &NSORT;
SORTER&Q = &&SORTER&Q;
%END;
RUN;
******************************************************************;
******* CREATE A DATASET OF ALL PATIENTS AND FORMS BEING *******;
******* EDITED AS PART OF THE EDIT TRACKING SYSTEM *******;
******************************************************************;
DATA ETSDATA;
SET ETSDATA
EDITDATA(KEEP=CENTER NETWORK FORM_ SORTER1 SORTER2
CREATED_ UPDATED_ site digit letter);
RUN;
PROC SORT DATA=ETSDATA;
BY CENTER NETWORK FORM_ SORTER1 SORTER2;
RUN;
THE REFORMATED PROGRAM:
=======================
LIBNAME &STUDY.&AUDIT "&STUDY.&AUDIT &WDISK";
LIBNAME &STUDY.MAST "&STUDY.MAST &WDISK";
LIBNAME &STUDY.SAS "&STUDY.SAS &WDISK";
LIBNAME &STUDY "&STUDY &EDISK";
**************************************************;
****** INITIALIZE ALL CUMULATIVE DATASETS ******;
**************************************************;
OPTIONS YEARCUTOFF=1930;
****Y2K CODE IMPLEMENTED 10/13/98;
DATA ERRALL;
DUMMY=1;
OUTPUT;
RUN;
/* ------------------------------------------------------------- */
/* THE ALLDEL DATA SET IS USED TO HOLD FORMS THAT HAVE BEEN */
/* DELETED AND THUS RESOLVING THE EDITS ON THOSE FORMS. */
/* ------------------------------------------------------------- */
%MACRO SETDEL;
DATA ALLDEL;
LENGTH NETWORK SORTER1 SORTER2 8. CENTER 2. FORM $5;
RETAIN NETWORK SORTER1 SORTER2 CENTER . FORM ' ';
STOP;
RUN;
%MEND;
%SETDEL;
DATA ETSDATA;
DUMMY=1;
OUTPUT;
RUN;
********************************************************************;
*** START OF DOIT MACRO - RUNNING OF EDITS BY FORM ***;
*** THE DOIT MACRO LOOPS THROUGH EACH FORM AND PERFORMS EDITS ON ***;
*** ALL OF THE SELECTED FORMS FOR THE SELECTED WEEK RANGE -- ONE ***;
*** WEEK, ALL WEEKS, OR A SET OF CONSECUTIVE WEEKS. ***;
********************************************************************;
%MACRO DOIT(FORM,SORTER1,SORTER2);
DATA EDITDATA;
LENGTH SORTER1 SORTER2 8.;
SET &STUDY.MAST.&FORM;
/* CHECK TO SEE IF WE IGNORE TEST NETWORK DATA */
%IF &NETTST = N %THEN %DO;
WHERE (NETWORK < 10000);
%END;
/* SUBSET ON ONE WEEK OR THE WEEK RANGE IF NOT EDITING ALL DATA
*/
%IF &ALLWEEKS=N %THEN %DO;
IF &LOWK<=_BatchNo_<=&HIWK;
%END;
;
WKOFFORM = _BatchNo_;
/* ASSIGN THE VALUES OF THE SORTER VARIABLES (IF ANY) TO */
/* THE VARIABLES SORTER1 AND SORTER2 */
%DO Q=1 %TO &NSORT;
SORTER&Q = &&SORTER&Q;
%END;
RUN;
******************************************************************;
******* CREATE A DATASET OF ALL PATIENTS AND FORMS BEING *******;
******* EDITED AS PART OF THE EDIT TRACKING SYSTEM *******;
******************************************************************;
DATA ETSDATA;
SET ETSDATA EDITDATA(KEEP=CENTER NETWORK FORM_ SORTER1 SORTER2
CREATED_ UPDATED_ site digit letter);
RUN;
PROC SORT DATA=ETSDATA;
BY CENTER NETWORK FORM_ SORTER1 SORTER2;
RUN;