Veröffentlicht am :

Makro mf_mkdir - Rekursive Verzeichniserstellung

Dieser Code ist auch verfügbar auf: English Español Français
Das Makro `mf_mkdir` ist dafür konzipiert, ein durch den Parameter `dir` spezifiziertes Verzeichnis zu erstellen.
Es verwaltet Pfade robust, indem es potenzielle Schrägstrichzeichen (`/` oder `\`) am Ende des Pfades überprüft und entfernt, sowie Pfade ignoriert, die einzelne Laufwerksbuchstaben darstellen (wie 'C:').
Bevor versucht wird, ein Verzeichnis zu erstellen, verwendet das Makro `%sysfunc(fileexist())`, um dessen Existenz zu überprüfen.
Wenn das Verzeichnis nicht existiert, zerlegt es den Pfad in sein tiefstes Kindverzeichnis (`child`) und sein Elternverzeichnis (`parent`).
Es ruft sich dann rekursiv auf (`%mf_mkdir(&parent)`), um sicherzustellen, dass alle Elternverzeichnisse erstellt werden.
Sobald die Eltern etabliert sind, verwendet es `%sysfunc(dcreate(&child, &parent))`, um das endgültige Verzeichnis zu erstellen.
Im Falle eines Erstellungsfehlers wird eine Fehlermeldung über `%put ERROR:` angezeigt und die Ausführung mit `%abort cancel` abgebrochen.
Wenn das Verzeichnis bereits existiert, beendet sich das Makro stillschweigend.
Das Makro ist so konzipiert, dass es in Windows- und Unix-Umgebungen funktioniert, wodurch es mit SAS© Viya 4 kompatibel ist.
Datenanalyse

Type : AUCUNE


Das Makro verarbeitet keine SAS-Datasets. Es arbeitet direkt im Dateisystem unter Verwendung eines als Parameter übergebenen Verzeichnispfades.

1 Codeblock
Makro %mf_mkdir
Erklärung :
Dieser Block enthält die vollständige Definition des Makros `%mf_mkdir`.
Das Makro nimmt einen Verzeichnispfad (`dir`) als Parameter entgegen.
Es beginnt mit Eingabeprüfungen: Es erkennt und ignoriert Pfade, die Laufwerksbuchstaben sind (z.B. 'C:') und entfernt abschließende Schrägstriche, falls vorhanden, außer für das Stammverzeichnis.
Dies gewährleistet eine konsistente Pfadbehandlung.
Der Kern der Logik ist ein bedingter Block, der ausgeführt wird, wenn das Zielverzeichnis nicht existiert (überprüft durch `%sysfunc(fileexist)`).
Innerhalb dieses Blocks:
1. Der Pfad wird zerlegt, um die letzte Komponente (`child`) und den Pfad seines Elternteils (`parent`) zu identifizieren.
2. Das Makro ruft sich selbst rekursiv auf (`%mf_mkdir(&parent)`), um sicherzustellen, dass alle Elternverzeichnisse existieren, bevor versucht wird, das aktuelle Verzeichnis zu erstellen.
3. Das Verzeichnis `child` wird im `parent` unter Verwendung der Funktion `%sysfunc(dcreate(&child, &parent))` erstellt. Diese Funktion ist mit Windows- und Unix-Dateisystemen kompatibel.
4. Eine rudimentäre Fehlerbehandlung ist enthalten: Wenn `dcreate` fehlschlägt (eine leere Zeichenkette zurückgibt), wird eine Fehlermeldung (`%put ERROR:`) angezeigt und die Ausführung der SAS-Sitzung abgebrochen (`%abort cancel`).
Im Erfolgsfall wird eine Bestätigungsmeldung angezeigt.
Das Makro ist idempotent konzipiert: Wenn das Verzeichnis bereits existiert, tut es nichts und beendet sich stillschweigend.
Kopiert!
1%macro mf_mkdir(dir
2)/*/STORE SOURCE*/;
3 
4 %local lastchar child parent;
5 
6 %let lastchar = %substr(&dir, %LENGTH(&dir));
7 %IF (%bquote(&lastchar) eq %str(:)) %THEN %DO;
8 /* Cannot create drive mappings */
9 %return;
10 %END;
11 
12 %IF (%bquote(&lastchar)=%str(/)) or (%bquote(&lastchar)=%str(\\_)) %THEN %DO;
13 /* last char is a slash */
14 %IF (%LENGTH(&dir) eq 1) %THEN %DO;
15 /* one single slash - root location is assumed to exist */
16 %return;
17 %END;
18 %ELSE %DO;
19 /* strip last slash */
20 %let dir = %substr(&dir, 1, %LENGTH(&dir)-1);
21 %END;
22 %END;
23 
24 %IF (%sysfunc(fileexist(%bquote(&dir))) = 0) %THEN %DO;
25 /* directory does not exist so prepare to create */
26 /* first get the childmost directory */
27 %let child = %scan(&dir, -1, %str(/\\:));
28 
29 /*
30 If child name = path name then there are no parents to create. Else
31 they must be recursively scanned.
32 */
33 
34 %IF (%LENGTH(&dir) gt %LENGTH(&child)) %THEN %DO;
35 %let parent = %substr(&dir, 1, %LENGTH(&dir)-%LENGTH(&child));
36 %mf_mkdir(&parent)
37 %END;
38 
39 /*
40 Now create the directory. Complain loudly of any errs.
41 */
42 
43 %let dname = %sysfunc(dcreate(&child, &parent));
44 %IF (%bquote(&dname) eq ) %THEN %DO;
45 %put %str(ERR)OR: could not create &parent + &child;
46 %abort cancel;
47 %END;
48 %ELSE %DO;
49 %put Directory created: &dir;
50 %END;
51 %END;
52 /* exit quietly if directory did exist.*/
53%mend mf_mkdir;
Dieses Material wird von We Are Cas "wie besehen" zur Verfügung gestellt. Es gibt keine ausdrücklichen oder stillschweigenden Garantien hinsichtlich der Marktgängigkeit oder Eignung für einen bestimmten Zweck in Bezug auf die hierin enthaltenen Materialien oder Codes. We Are Cas ist nicht verantwortlich für Fehler in diesem Material, wie es jetzt existiert oder existieren wird, noch bietet We Are Cas technischen Support dafür an.
Urheberrechtsinformationen : Copyright (c) 2001-2006 Rodney Sparapani; Copyright 2010-2023 HMS Analytical Software GmbH, http://www.analytical-software.de (Informationen aus der in der Makrohilfe referenzierten Datei _version.sas extrahiert).