Le script utilise la vue système `SASHELP.VEXTFL` pour obtenir la liste des chemins associés au fileref `SASAUTOS`. Ensuite, il lit le contenu de ces répertoires sur le système de fichiers pour lister les programmes de macros.
1 Bloc de code
Macro Data
Explication : Cette macro, `MEMLIST`, prend en entrée des parties de nom de répertoire et un chemin complet (`XPATH`). Elle utilise les fonctions `filename`, `dopen`, `dread` et `dclose` pour lire la liste des fichiers d'un répertoire. Pour chaque fichier avec une extension `.sas`, elle extrait le nom du fichier et le stocke dans une table SAS. Enfin, `PROC SORT` avec l'option `nodups` supprime les doublons de noms de fichiers au sein de ce même répertoire.
Copié !
%MACRO MEMLIST(DIR1,DIR2,XPATH);
%*get list of members in directory;
DATA &DIR1._&DIR2.(keep = Dir1 Dir2 FileName);
length Dir1 Dir2 FileName $ 8;
retain Dir1 "&DIR1."
Dir2 "&DIR2.";
Rc = filename('dir', "&XPATH.");
DsId = dopen('dir');
if DsId then do; dim_DS=dnum(DsId);
do MemNum = 1 to dim_DS; MemName = lowcase(dread(DsId, MemNum));
*put memname=;
if scan(MemName,-1,'.') eq 'sas' then do;
FileName=scan(MemName,-2,'.\');
output;
%*if scan; end;
%*do memnum; end;
%*if DsId; end;
Rc=dclose(DsId);
run;
%*user names may be in upper & lower case
SI macros are all lower case
note FileName has been lowcased;
proc SORT data = &DIR1._&DIR2.
nodups;
by FileName;
run;%*.........................................; %MEND;
1
%MACRO MEMLIST(DIR1,DIR2,XPATH);
2
%*get list of members in directory;
3
DATA &DIR1._&DIR2.(keep = Dir1 Dir2 FileName);
4
LENGTH Dir1 Dir2 FileName $ 8;
5
retain Dir1 "&DIR1."
6
Dir2 "&DIR2.";
7
Rc = filename('dir', "&XPATH.");
8
DsId = dopen('dir');
9
IF DsId THENDO; dim_DS=dnum(DsId);
10
DO MemNum = 1 to dim_DS; MemName = lowcase(dread(DsId, MemNum));
Explication : Ce bloc DATA STEP lit la vue système `SASHELP.VEXTFL` pour trouver toutes les assignations de librairies externes. Il filtre ces résultats pour ne garder que le fileref `SASAUTOS`, qui définit les chemins des librairies de macros autocall. Pour chaque chemin trouvé, il utilise `CALL EXECUTE` pour générer et exécuter un appel à la macro `%MEMLIST`, qui va lister le contenu du répertoire correspondant.
Copié !
DATA DSN(keep = Dir1 Dir2);
length Dir1 Dir2 $ 8;
set SASHELP.VEXTFL
(where=(FileRef eq 'SASAUTOS'));
DIR2= scan(trim(xPath),-1,'\');%*trim is a kludge;
DIR1= scan(trim(xPath),-2,'\');
call execute('%MEMLIST(' !! Dir1
!! ','!! Dir2
!! ','!! xPath
!! ');');
1
DATA DSN(keep = Dir1 Dir2);
2
LENGTH Dir1 Dir2 $ 8;
3
SET SASHELP.VEXTFL
4
(where=(FileRef eq 'SASAUTOS'));
5
DIR2= scan(trim(xPath),-1,'\');%*trim is a kludge;
6
DIR1= scan(trim(xPath),-2,'\');
7
call execute('%MEMLIST(' !! Dir1
8
!! ','!! Dir2
9
!! ','!! xPath
10
!! ');');
3 Bloc de code
DATA STEP
Explication : Ce DATA STEP `_NULL_` est utilisé pour générer dynamiquement un autre programme SAS. Il construit une étape DATA qui concatène toutes les tables créées précédemment par les appels à `%MEMLIST`. Il ajoute une clause `BY` pour trier par nom de fichier, et une logique pour créer une variable `Note` contenant le texte 'duplicate' si un même nom de fichier (`FileName`) apparaît dans plus d'un répertoire.
Copié !
DATA _NULL_;
call execute('data ALL;set');
do until(EndoFile);
set DSN end = EndoFile;
call execute( trim(Dir1) !! '_' !! Dir2 ); end;
call execute('; by FileName Dir1 Dir2;');
call execute(
"if not(first.FileName and last.FileName) then Note='duplicate';");
stop;
1
DATA _NULL_;
2
call execute('data ALL;set');
3
DO until(EndoFile);
4
SET DSN END = EndoFile;
5
call execute( trim(Dir1) !! '_' !! Dir2 ); END;
6
call execute('; by FileName Dir1 Dir2;');
7
call execute(
8
"if not(first.FileName and last.FileName) then Note='duplicate';");
9
stop;
4 Bloc de code
PROC PRINT
Explication : Cette procédure affiche le contenu de la table `ALL` qui a été créée dynamiquement à l'étape précédente. Le rapport final liste tous les fichiers de macros et met en évidence les doublons potentiels.
Copié !
proc PRINT data = ALL;
run;
1
PROC PRINTDATA = ALL;
2
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.
Informations de Copyright : Auteur: RJF2, Date: 00Sep11
SAS et tous les autres noms de produits ou de services de SAS Institute Inc. sont des marques déposées ou des marques de commerce de SAS Institute Inc. aux États-Unis et dans d'autres pays. ® indique un enregistrement aux États-Unis. WeAreCAS est un site communautaire indépendant et n'est pas affilié à SAS Institute Inc.
Ce site utilise des cookies techniques et analytiques pour améliorer votre expérience.
En savoir plus.