Einlesen von Dateien in Abhängigkeit vom Dateidatum

Hi,

vielleicht hat jemand hier eine gute Idee/Lösung für mich...

Im Moment lese ich alle Dateien eines Verzeichnisses nach SAS ein. Das löse ich per "Multifile" im INFILE. Die einzulesenden Dateien lege ich per "DOS-Dir" fest.

%LET PFAD=dir %STR(%")H:\iTM1_BWS_DSS\kc*.csv%STR(%") /b;
FILENAME INDATA PIPE "&PFAD";

Das liefert mir die nackte Liste aller infrage kommender Dateinamen.

Nun wird das Verzeichnis inzwischen zu groß, um alle Dateien einzulesen und ich möchte nur einen Teil der Dateien berücksichtigen. Vom Dateinamen kann ich leider nichts ableiten :-(

Gibt es eine Möglichkeit, eine solche Dateianlistung zu erstellen, wo das Dateidatum in einem bestimmten Zeitraum liegt?

Erst dachte ich an daran, die Dateien datumsabhängig zu kopieren und dort dann das DIR loszulassen, aber insgesamt sind knapp 2 GB Daten betroffen... das wäre zum Kopieren etwas viel...

Gruß aus Hamburg
Marco Schmidt

SAS8.2

Nur so eine Idee als

Nur so eine Idee als Grobkonzept:
Falls man in DOS den DIR-Befehl irgendwie anweisen kann, dass er das Datum anzeigt oder nur Dateien in einem bestimmten Fenster angibt könnte es so gehen:
Über den X-Befehl den Dos-Prompt aufrufen, die Liste erzeugen lassen und in eine Datei ausgeben lassen.
Dann diese Datei einlesen und daraus die nötigen Schritt ableiten, um nur die gewünschten Dateien einzulesen.

Viele Grüße
Simon

Gute Idee

Danke für die gute Idee :-) Genau daran hab ich mich auch grad versucht und just eine Lösung gefunden!

/* Quellverzeichnis*/
%LET IMPPFAD=C:\TEMP;

/* Erstellen eines DOS-DIR CMD /T:W -> zuletzt gespeichert*/
%LET DIRPFAD=dir %STR(%")&IMPPFAD.\*.csv%STR(%") /T:W;

/* Zuordnen des Ergebnisses zum FILENAME*/
FILENAME INDAT1 PIPE "&DIRPFAD";

/* Weitere Parameter für Dateidatum */
%LET MONAT= 6;
%LET JAHR = 2009;
%LET TAG = 26;

/* Ausgabe aus DIR aufbereiten
die NOTEs beim Einlesen entstehen durch die zusätzlichen
Kopf- und Fußzeilen des DIR-CMD und können ignoriert werden*/
DATA IMPDATEIEN
( WHERE= ( YEAR(DAT) EQ &JAHR
AND MONTH(DAT) EQ &MONAT
AND DAY(DAT) EQ &TAG
)
)
;
INFILE INDAT1 TRUNCOVER;
FORMAT DAT EURDFDD10.
SIZE COMMAX15.
;
INFORMAT DAT DDMMYY10.
SIZE COMMAX15.
;
INPUT @1 DAT
@25 SIZE
@37 DATEINAME $50.
;
N=_N_;
RUN;

/* Einlesen der Dateien */
DATA WORK.TEST;
/* erstmal die Dateinamen auflösen*/
SET IMPDATEIEN;
DATEINAME= "&IMPPFAD.\" || DATEINAME;
/* und dann die Dateien einlesen*/
INFILE DUMMY
FILEVAR = DATEINAME
END = DONE
DELIMITER = ';' MISSOVER DSD LRECL=32767;

DO WHILE(NOT DONE);
INPUT FELD $;
OUTPUT;
END;
PUT 'gelesene Datei: ' DATEINAME=;
RUN;

Der Vollständigkeit halber noch die erste Variante ohne Betrachtung des Dateidatums:

/* Quellverzeichnis*/
%LET IMPPFAD=C:\TEMP;

/* Erstellen eines DOS-DIR CMD /b -> nur Anlistung der Dateinamen*/
%LET DIRPFAD=dir %STR(%")&IMPPFAD.\*.csv%STR(%") /b;

/* Zuordnen des Ergebnisses zum FILENAME*/
FILENAME INDATA PIPE "&DIRPFAD";

/* Einlesen der Dateien */
DATA WORK.TEST;
/* erstmal die Dateinamen auflösen*/
INFILE INDATA TRUNCOVER;
LENGTH DATEINAME $ 300;
INPUT DATEINAME $ 1-300;
DATEINAME= "&IMPPFAD.\" || DATEINAME;
/* und dann die Dateien einlesen*/
INFILE DUMMY
FILEVAR = DATEINAME
END = DONE
DELIMITER = ';' MISSOVER DSD LRECL=32767;

DO WHILE(NOT DONE);
INPUT FELD $;
OUTPUT;
END;
PUT 'gelesene Datei: ' DATEINAME=;
RUN;

Danke und Gruß
Marco

Wahnsinn was man alles mit

Wahnsinn was man alles mit dem Filename-Statement anstellen kann.
Ich hatte mir meine eigene Idee viel komplizierter vorgestellt ;)

... und ich wette, das geht

... und ich wette, das geht bestimmt noch kürzer, wenn erstmal die wahrhaftigen Profis hier im Forum einen Blick darauf geworfen haben :-)

verflixtes /

/sascode... leider kann ich den Beitrag nicht editieren...