Publié le :
Macro CREATION_INTERNE

Extraire les chemins de l'option SASAUTOS

Ce code est également disponible en : Deutsch English Español Français
En attente de validation
Ce script définit et exécute une macro nommée `%getautos`. Cette macro lit la valeur de l'option système `SASAUTOS`, qui contient une liste de chemins où SAS© recherche les macros. Le code analyse cette chaîne de caractères pour en extraire chaque chemin individuel. Il gère divers cas de figure, comme les chemins entre guillemets, la substitution de variables d'environnement (préfixées par `!`) et l'expansion du tilde (`~`) pour les répertoires personnels sous Unix/Linux. La macro génère une table de sortie (`work.paths` par défaut) contenant la liste des chemins extraits. Le script se termine en exécutant la macro et en affichant le résultat, ainsi qu'en imprimant la valeur brute de `SASAUTOS` et `SASROOT`.
Analyse des données

Type : CREATION_INTERNE


Le script ne lit pas de données externes. Il génère une table de données nommée 'paths' dans la librairie WORK. Le contenu de cette table est dérivé de la valeur de l'option système SAS 'SASAUTOS'.

1 Bloc de code
DATA STEP Data
Explication :
Ce bloc définit la macro `%getautos`. Elle utilise une étape DATA pour traiter la chaîne de caractères obtenue via `GETOPTION('sasautos')`. La logique parcourt la chaîne, extrait chaque chemin en utilisant la fonction `SCAN`, gère les guillemets, et effectue des substitutions pour les variables d'environnement (via `SYSGET`) et le tilde (`~`). La fonction `PATHNAME` est utilisée pour résoudre les filerefs. Chaque chemin valide est ajouté à la table de sortie spécifiée par le paramètre `out`.
Copié !
1%macro getautos(out=paths);
2 DATA &out ( keep = path ) ;
3 LENGTH q $ 32000 temp $ 300 var path $ 255 ;
4 q = getoption ( "sasautos" ) ;
5 
6 *-- remove surrounding (), and internal quotes;
7 IF index ( q , "(" ) THEN
8 q = left(translate ( q , " " , "()'\"" )) ;
9 
10 DO while ( 1 ) ;
11 
12 temp = scan ( q || "***" , 1 , "() " ) ;
13 
14 IF temp = "***" THEN leave ;
15 
16 q = left(substr ( q , LENGTH ( temp ) + 1)) ;
17 
18 IF temp =: "!" THEN
19 DO ;
20 var = scan ( temp , 1 , "!/\ " ) ;
21 temp = tranwrd ( temp , '!' || trim(var)
22 , sysget(trim(var)) ) ;
23 END ;
24 
25 *-- do tilda expansion. Works for ~/ and ~user/ where user is
26 the current user;
27 IF temp =: "~" & symget('sysscp') ^= 'WIN' THEN
28 DO ;
29 var = scan ( temp , 1 , "~/\" ) ; put var=;
30 home = sysget('HOME'); put home=;
31 if var = ' '
32 then temp = tranwrd( temp, '~', sysget('HOME'));
33 else do;
34 userid = sysget('USER'); put userid=;
35 temp = tranwrd( temp, '~' || trim(userid), sysget('HOME'));
36 put temp=;
37 end;
38 end ;
39 
40 *-- Check for a fileref;
41 path = pathname ( temp ) ;
42 if path = " " then path = temp ;
43 
44 if index ( path , "(" ) then
45 do ;
46 q = trim(left(translate(path, " ", "()'\"""))) || " " || trim ( q ) ;
47 end ;
48 else
49 if path ^= "***" THEN
50 OUTPUT ;
51 END ;
52 RUN ;
53%mend;
2 Bloc de code
PROC PRINT
Explication :
Ce bloc exécute la macro `%getautos` avec ses paramètres par défaut, ce qui crée la table `work.paths`. Ensuite, `PROC PRINT` est utilisée pour afficher le contenu de cette table résultante dans la fenêtre de sortie.
Copié !
1%getautos();
2PROC PRINT DATA = paths ; RUN ;
3 Bloc de code
DATA STEP
Explication :
Cette étape `_NULL_` n'a pas pour but de créer une table SAS. Elle utilise une instruction `FILE PRINT` pour écrire des informations dans la sortie standard (ou le log). Elle récupère et affiche la valeur de la variable d'environnement `SASROOT` via `SYSGET`, puis la valeur brute de l'option `SASAUTOS`. Elle effectue ensuite quelques manipulations de chaînes (`COMPBL`, `COMPRESS`) sur la valeur de `SASAUTOS` et affiche les résultats.
Copié !
1DATA _null_;
2 file PRINT;
3 LENGTH sasautos $32000 sasroot $200;
4 sasroot = sysget('SASROOT');
5 put 'SASROOT:' sasroot=;
6 sasautos = getoption('sasautos');
7 put sasautos=;
8 sasautos = compbl(sasautos);
9 put sasautos=;
10 sasautos = compress(sasautos, '("'')');
11 put 'SASAUTOS:' sasautos=;
12 RUN;
Ce matériel est fourni "tel quel" par We Are Cas. Il n'y a aucune garantie, expresse ou implicite, quant à la qualité marchande ou à l'adéquation à un usage particulier concernant le matériel ou le code contenu dans les présentes. We Are Cas n'est pas responsable des erreurs dans ce matériel tel qu'il existe maintenant ou existera, et We Are Cas ne fournit pas de support technique pour celui-ci.