Verwaltung von SAS-Codes

Hallo zusammen,

bei uns entstehen immer mehr SAS-Codes, die wir gerne in einem komfortablen Verwaltung
einschliessen würden.
Wie kann man auch gezielt über hunderte SAS-Codes effektiv suchen usw.
Wie lauft es bei Euch??
Datenverwaltung und Dokumentationen wären für uns auch interessant. Sprich in Flatfiles
nach Datenfelder suchen, und und und...

Vielen Dank und Grüsse
Thomas

Suchen von Zeichenketten in SAS-Programmen

Hallo Thomas,

als wir vor einiger Zeit vom Host auf UNIX gewechselt sind habe ich die Search-For Utility vermisst. Mit dem UNIX-Befehl grep, dem FILENAME-Statement und dem Pipe DeviceType habe ich damals so etwas nachgebastelt, was uns sehr geholfen hat. Anbei der Code:


/*****************************************DOKUBLOCK*********************************************
 *                                                                                             *
 *   Programmname: SUCH                                                                        *
 *                                                                                             *
 *   Beschreibung: Dieses Programm sucht im Pfad &pfad. nach einer bestimmten Zeichenkette     *
 *                 Als Ausgabe bekommt man den Programmnamen, die Zeile und das Coding in der  *
 *                 entsprechenden Zeile.                                                       *
 *                                                                                             *
 *   Parameter: Zeichenkette: Diese Zeichenkette wird auf der AUTOLIB gesucht                  *
 *              Prefix      : Hier kann man angeben, wie die Programme beginnen. Lässt man den *
 *                            Parameter frei, dann wird in der ganzen AUTOLIB gesucht.         *
 *                            Ansonsten wird nur in den Programmen gesucht, die mit &Prefix    *
 *                            anfangen.                                                        *
 *              ig          : i   : Gross-/Kleinschreibung wird ignoriert (Default)            *
 *                            wird der Parameter weggelassen, dann wird gross und klein unter- *
 *                            schieden.                                                        *
 *    Beispielaufruf: %such(Zeichenkette=alter,prefix=abc,ig=i);                            *
 *                                                                                             *
 *   Version       Author            Datum                 Beschreibung                        *
 *   --------------------------------------------------------------------------------------    *
 *   1.0         W.Hornung          01.12.2005             Neuerstellung                       *
 *                                                                                             *
 ***************************************DOKUBLOCK-ENDE******************************************/
%macro such(pfad=,Zeichenkette=,prefix=,ig=i);
filename ps_list pipe
"grep -&ig.n &Zeichenkette &pfad./&prefix.*";
data temp(keep=Programm Zeile Coding);
infile
  ps_list
  delimiter=
'09'x
  
missover
  dsd
  ;
length
  in $
256
  
tmp $ 56
  
Programm $15
  
Zeile 8
  
Coding $200
  
;
input
  in $ @
  ;
tmp=scan(in,
1,':');
Programm=scan(tmp,
7,'/');
Zeile=input(scan(in,
2,':'),5.);
Coding=trim (left(scan(in,
3,':')));
run;

proc sort data=temp;
by Programm Zeile;
run;

data Suchergebnis;
set temp;
by Programm Zeile;
if not first.Programm then Programm=
"";
run;

proc print data=Suchergebnis noobs;
title
"Folgende Programme &pfad./&prefix.* enthalten die Zeichenkette: &Zeichenkette";
run;
%mend such;

Man kann es an der ein oder anderen Ecke noch verfeinern, insbesondere wird der Code manchmal nicht angezeigt, wenn das Coding nicht gleich zu Beginn einer Zeile anfängt. Das war uns jedoch nicht so wichtig, sondern hauptsächlich die Programmzeile. Das zumindest für die UNIX-Ecke, ich denke jedoch, dass es in anderen Betriebssystemen ähnliche Systembefehle gibt.

Ich hoffe es hilft weiter.

Gruß
Wolfgang

PS: Die Parameter in den Scan-Befehlen, insbesondere den für die Variable Programm muss man natürlich anpassen, je nach Betriebssytem bzw. Anzahl von (Back)Slashes in der Pfadangabe.

Suchen von Zeichenketten in SAS-Programmen

Hallo,
auch wir haben das Problem der Verwaltung von immer mehr SAS-Codes ...
Bei uns fängt das Problem schon früher an:
Ohne viel Overhead wollen wir unsere SAS-Codes für "alle" im SAS-Team zugänglich haben (alle=zwei). Lösung: Windows-Netzlaufwerk, dort liegen SAS-Kataloge mit Entries von Typ SOURCE. Der ganze SAS-Catalog ist gegen Zugriff vom Rest gesperrt wenn eine/r einen Entry geöffnet hat. (Ist nicht elegant, da recht grob, aber ist OK).
Die Produktions-Umgebung ist SAS unter UNIX entweder im Batch (also UNIX alleine) oder Client/Server mit SAS-Connect. In beiden Fällen muß der Source-Code auf der UNIX-Maschine sein. Kein Problem: Ein SAS-Macro durchläuft alle (relevanten) Librefs und macht für jeden gefundenen SAS-Catalog einen Upload.

Bleibt das Problem der Voll-Text-Suche!
Wir haben es rein mit UNIX-Bord-Mitteln gelöst: Ab+Zu erfolgt (mit einem weiteren Upload-Macro) ein Upload aller Sourcen aus Entries von SAS-Catalogs von Windows nach UNIX jeweils in ein UNIX-flat-file (Dateiname z.B. d3_appl.al3_kund.source). Die Suche erfolgt mit einem UNIX-Shell-Script srcgrep, das im wesentlichen aus dem grep-Befehl besteht (bzw. aus dem egrep-Befehl). Bei uns ist die Spezialität, dass man nach beliebig vielen Worten/Begriffen/Text-Teilen suchen kann und es ist egal ob bzw. was zwischen den Begriffen steht! Es wird die Fundstelle mit Datei-Name (= catalog-entry-Name) und mit Zeilennummer ausgegeben
Beispiel:

SASHOST > srcgrep if nobsalt nobsneu
d3_adm.al3_adm2.source:8948:    %if &nobsALT. ne &nobsNEU.   /*
 20070516: Steuer-Datei uniq ??? */
d3_rdata.extr2def.source:4525:    %if  &nobsAlt. EQ &nobsNeu.

Natürlich kann man jeden Text-Teil damit finden, egal ob Kommentar oder Code.
Die Treffer-Liste läßt sich mit den üblichen UNIX-Tools wunderbar nachbessern, z.B. unwichtige Treffer unterdrücken.
Beispiel mit zu vielen Treffern:

SASHOST > srcgrep sys exist
d3_adm.al3_adm0.source:880:    %if %sysfunc( exist( work._errcode ) )
d3_adm.al3_adm0.source:921:    %if NOT %sysfunc( exist( &inlib..&infile. ))
d3_adm.al3_adm0.source:1660:    %if %sysfunc( exist( work._errcode ) )
d3_adm.al3_adm0.source:1685:    %if NOT %sysfunc( exist( &tstfile. ))
d3_adm.al3_adm1.source:410:    %if %sysfunc( exist( work._errcode ) )
d3_adm.al3_adm1.source:714:    %if %sysfunc( exist( work._errcode ) )

Beispiel, Treffer-Liste nachgebessert:

SASHOST/sas:/usr/ssi/bin (9695) > srcgrep sys exist | grep -v _errcode |pg
d3_adm.al3_adm0.source:921:    %if NOT %sysfunc( exist( &inlib..&infile. ))
d3_adm.al3_adm0.source:1685:    %if NOT %sysfunc( exist( &tstfile. ))
d3_adm.al3_adm1.source:5183:    %if %sysfunc( exist( &infileX. ) )
d3_adm.al3_adm1.source:6124:    %if %sysfunc( exist( &infileX. ) )
d3_adm.al3_adm1.source:6933:        %if NOT %sysfunc( exist( &inlib..&ParkDat. )

Gruß
Hans Kneilmann, Schäfer Shop GmbH (SSI)