Inhalt eines Verzeichnisses erfragen und Dateien dynamisch lesen

Hallo zusammen,

Folgende Situation: Auf einem SAS-Server (AIX 5.3) entstehen und verschwinden in einem bestimmten (festen) Verzeichnis dynamisch Dateien.
Ich möchte nun mit einem SAS-Programm dieses Verzeichnis abfragen und aus jeder zum Abfragezeitpunkt existierenden Datei etwas auslesen.
Die Dateien selbst genügen dabei zunächst einmal keiner bestimmten Namenskonvention, aber es sind immer alle Dateien des Verzeichnisses gefragt.

Ich habe jetzt auf Anhieb keine Möglichkeit gefunden, ein AIX Kommando 'ls -ltr' (ähnlich dem DOS/WINDOWS-Kommando 'dir') oder ähnliches abzusetzen und dessen Ausgabe z.B. in ein kleines SAS-Dataset zu schieben, welches man dann Stück für Stück abarbeiten könnte.

Kennt hier jemand vielleicht eine Lösung?

Schönen Gruß

Olaf Musch

Es gibt mehrere Möglichkeiten

Mit call system() kann man Systembefehle absetzen. Wenn man die Ausgabe von ls in eine Datei umleitet, könnte man die mit SAS bearbeiten. call system() kann sowohl in Data-Step als auch in SCL verwendet werden.

Wenn man mit SCL arbeitet, kann man etwas eleganter mit dopen, dread und dclose direkt vom SAS aus auf das Verzeichnis zugreifen. Es müsste auch möglich sein, das Ganze in Form eines Makros mit %sysfunc aufzubauen, dann kann man die SCL-Befehle auch im Data-Step nutzen.

Gruß Guido Stosnach
Winicker Norimed GmbH

Hallo, danke für die

Hallo,

danke für die schnelle Antwort. Ich habe jetzt mal folgendes versucht:

filename job_dir "/existierendes/directory";

data jobfiles (keep = name);

   
length name $ 80;

   did = dopen(job_dir);
   
put did;

   
if did ~= 0 then do;
      memcount = dnum(did);
      
put memcount;
      
if memcount ~= 0 then do;
         
do j=1 to memcount;
            name=dread(did, j);
            
output;
         
end;
      
end;
      
else do;
         name =
'no files found!';
         
output;
      
end;
   
end;
   
else do;
      name =
'directory can not be opened!';
      
output;
   
end;
run;
Leider bekomme ich beim DOPEN() schon immer eine 0 als return code.
Die Berechtigung des Users auf dem Verzeichnis ist aber in Ordnung.

Mit call system() komme ich leider nicht weiter, weil ich aus dem Enterprise Guide heraus kein Shell-Exec machen kann.
Und für Piping hat der User leider keine Berechtigung (FILENAME ... PIPE 'ls ...';).

Was an meinem obigen Code ist denn falsch?

Schönen Gruß

Olaf Musch

kleine Änderung

mit

rc=fileref('job_dir',"/existierendes/directory");
innerhalt des Data-Step und
did = dopen('job_dir');
hat es bei mir funktioniert. Allerdings verwende ich keinen EG sondern einen X-Server und arbeite quasi direkt aus dem SAS-Server.
Die merkwürdige Schreibweise des Fileref ('job_dir') hab ich nie so richtig verstanden, aber wenn es funktioniert.

Gruß Guido Stosnach

Danke

Jetzt klappt's dann auch bei mir.

Der nächste Schritt ist jetzt für mich, in einem weiteren data step von jeder dieser Dateien die 8. Zeile zu lesen.

Aber das krieg ich dann schon irgendwie hin ;-)

Schönen Dank

Olaf Musch

Vielleicht so ...

%macro zeilen_lesen;
data _null_;
    set jobfiles end=ende;
        call symput(compress(
'name'!!putn(_n_,'4.')), NAME);
    if ende then
        call symput(
'AnzDat', putn(_n_,'4.'));
run;

data zeile_acht;
       set
%do i=1 %do &anzdat;
   
%if i NE &anzdat %then %do;
       &&name&
i.. (firstobs=8 obs=1)
   
%end;
   
%else %do;
       &&name&
i.. (firstobs=8 obs=1);
   
%end;
%end;
%mend zeilen_lesen;
%zeilen_lesen;

Viele Grüße

Olaf Wagner

firstobs mit obs

Hallo,
in dem obigen Beispiel sind zwei kleine Fehler drin.
Der erste ist mundartlich bedingt. Da war wohl ein Hesse (oder Schwabe??) am Werk, der DO und TO in der Aussprache nicht so trennen kann... (Achtung: Ironie, bin selbst Fast-Hesse)
Der andere kleine Fehler ist bei (firstobs=8 obs=1). Es muss lauten: firstobs=8 obs=8). Ausserdem ist das if-then-else unnötig, denn das SET-abschließende-Semikolon kann ganz einfach nach dem DO-schließenden-end stehen., also:

  data zeile_acht;
    
set
      
%do ii=1 %to &anzdat;
        &&name&
ii.. (firstobs=8 obs=8)
      
%end;
    ;
  
run;

Hans Kneilmann, Schäfer Shop GmbH (SSI)