SAS9

Wie man die N-te Datei in einem Unix-Verzeichnis mit SAS auswählt und liest

Simon 9 vues

Bei der Datenverarbeitung auf einem Server (insbesondere unter Unix) kommt es häufig vor, dass man Dateien bearbeiten muss, ohne ihren genauen Namen im Voraus zu kennen, sondern vielmehr ihre Position in einer sequenziellen Liste.

Stellen Sie sich folgendes Szenario vor: Ein Verzeichnis enthält etwa dreißig sequenziell benannte CSV-Dateien (z. B. a.txt, b.txt, usw.). Ihr Ziel ist es nicht, alles zu importieren, sondern gezielt die 27. Datei dieser Liste, unabhängig von ihrem Namen, zur Datenverarbeitung auszuwählen.

Hier ist eine robuste Methode, um eine bestimmte Datei basierend auf ihrer Position zu identifizieren, zu extrahieren und zu lesen, unter Verwendung der Systemfunktionen von SAS©.

Wie man die N-te Datei in einem Unix-Verzeichnis mit SAS auswählt und liest -

Die 3-Schritte-Strategie

Um sicherzustellen, dass wir wirklich die 27. Datei in alphabetischer (oder sequenzieller) Reihenfolge auswählen, können wir uns nicht auf die einfache Lesereihenfolge des Betriebssystems verlassen, die zufällig sein kann.

Das zu befolgende Verfahren ist wie folgt:

  1. Verzeichnisinhalt auflisten: Verwenden Sie die SAS©-Dateiverwaltungsfunktionen, um alle vorhandenen Dateinamen zu lesen.

  2. Liste sortieren: Ordnen Sie die Namen, um die Sequenzialität (A bis Z) sicherzustellen.

  3. Zieldatei extrahieren: Verwenden Sie einen direkten Zugriff (Zeiger), um den Namen der Datei an der Position N (hier 27) abzurufen und in einer Makrovariablen zu speichern.

Technische Umsetzung

Schritt 1 und 2: Abrufen und Sortieren

Zuerst erstellen wir eine SAS©-Tabelle (fnames), die die Liste aller Dateien im Ordner enthält. Dazu verwenden wir die Funktionen DOPEN (um den Ordner zu öffnen), DNUM (um die Dateien zu zählen) und DREAD (um die Namen zu lesen).

Wichtiger Hinweis: Es ist entscheidend, alle Dateien vor dem Sortieren zu lesen. Wenn man aufhört, bei der 27. gefundenen Datei zu lesen, durch die

1DATA fnames;
2 LENGTH dref $8 fname $200;
3 /* 1. Assigner le répertoire à un fileref */
4 rc = filename(dref, "/chemins/vers/mon_dossier");
5
6 /* 2. Ouvrir le répertoire */
7 did = dopen(dref);
8
9 /* 3. Boucler sur tous les fichiers présents */
10 IF did THEN DO i = 1 to dnum(did);
11 fname = dread(did, i);
12 OUTPUT; /* Ajoute le nom à la table */
13 END;
14
15 /* Fermeture propre du répertoire */
16 rc = dclose(did);
17 keep fname;
18RUN;
19 
20/* 4. Trier les fichiers par nom pour garantir l'ordre séquentiel */
21PROC SORT DATA=fnames;
22 BY fname;
23RUN;

Schritt 3: Direkte Auswahl mit der Option POINT=

Sobald die Liste sortiert ist, müssen wir nicht die gesamte Tabelle lesen. Die Anweisung SET mit der Option POINT= ermöglicht es, direkt zur gewünschten Zeile zu springen.

1DATA _null_;
2 /* Définir la position cible */
3 pt = 27;
4
5 /* Vérifier si le fichier existe (gestion d'erreur) */
6 IF pt > nobs THEN DO;
7 putlog "Erreur : Pas assez de fichiers dans le dossier.";
8 stop;
9 END;
10 
11 /* Accès direct à la 27ème observation */
12 SET fnames point=pt nobs=nobs;
13
14 /* Stocker le nom dans une macro-variable pour usage ultérieur */
15 call symputx('mon_fichier', fname);
16
17 /* Arrêter l'étape data immédiatement après la lecture */
18 stop;
19RUN;
20 
21/* Vérification dans la log */
22%put Le fichier sélectionné est : &mon_fichier;

Dieser Ansatz ist universell. Ob Sie die 27. oder die 100. Datei suchen, die Logik bleibt dieselbe. Sobald der Dateiname in der Makrovariablen &mon_fichier gespeichert ist, können Sie ihn dynamisch in einer Importprozedur (wie PROC IMPORT) oder einem klassischen Data-Step verwenden, um den Inhalt der Datei zu lesen.