Les données proviennent d'une source externe : la liste des fichiers d'un répertoire du système d'exploitation, obtenue via la commande 'dir' (Windows) exécutée par un 'filename pipe'. Ces informations sont ensuite traitées pour créer un jeu de données SAS interne ou affichées dans le log.
1 Bloc de code
DÉFINITION MACRO & INITIALISATION
Explication : Ce bloc définit la macro `dirlist` avec ses paramètres `path` et `outdn`. Il initialise également les valeurs par défaut de ces paramètres si elles ne sont pas fournies. `%superq` est utilisé pour vérifier si les paramètres sont vides, sans tenter de les résoudre, ce qui évite des erreurs pour les valeurs non-initialisées.
Copié !
%macro dirlist(path, outdn);
/*set the defualt value of the required params if the value is null*/
%if %superq(path)= %then %let path=&pdir.data;
%if %superq(outdn)= %then %let outdn=_null_;
1
%macro dirlist(path, outdn);
2
/*set the defualt value of the required params if the value is null*/
3
%IF %superq(path)= %THEN %let path=&pdir.DATA;
4
%IF %superq(outdn)= %THEN %let outdn=_null_;
2 Bloc de code
FILENAME PIPE
Explication : Cette instruction `filename pipe` est cruciale. Elle crée un fileref nommé `filelist` qui, au lieu de pointer vers un fichier physique, exécute une commande du système d'exploitation (`dir "&path" /o:n /b`) et traite sa sortie comme un fichier d'entrée. `dir /o:n /b` liste les fichiers du répertoire spécifié par `&path` (ordonnés par nom, format brut). Il est important de noter que 'dir' est une commande Windows ; pour un environnement Linux (courant pour SAS Viya), il faudrait utiliser une commande comme 'ls'.
Explication : Ce bloc est une étape DATA qui lit la sortie de la commande 'dir' via le fileref `filelist`. Chaque ligne de la sortie (qui correspond à un nom de fichier) est lue dans la variable `fullname`. Si le paramètre `outdn` est `_null_`, le `fullname` est directement écrit dans le log SAS. Sinon, le code analyse le `fullname` pour extraire l'extension (`extname`) et le nom de fichier sans extension (`filename`). Les fonctions `index`, `scan`, `substr`, `length`, `lowcase` et `call missing` sont utilisées pour ce parsage.
Copié !
data &outdn;
/*The max length of the name of a PC file is 255*/
length fullname $255 %if &outdn ne _null_ %then filename $255 extname $10 ; ;
infile filelist truncover dlm="|";
input fullname;
%if &outdn=_null_ %then put fullname %str(;) ;
%else %do;
if index(fullname, ".") then do;
extname=lowcase(scan(fullname, -1, '.'));
filename=substr(fullname, 1, length(fullname)-length(extname)-1);
end;
else do;
filename=fullname;
call missing(extname);
end;
%end;
run;
1
DATA &outdn;
2
/*The max length of the name of a PC file is 255*/
Explication : Si un jeu de données de sortie (`outdn`) a été spécifié (c'est-à-dire non `_null_`), ce bloc exécute une `PROC SORT`. Cette procédure trie le jeu de données créé par la DATA step selon la variable `extname` (extension de fichier), organisant ainsi les fichiers par type.
Copié !
%if &outdn ne _null_ %then %do;
proc sort data=&outdn;
by extname;
run;
1
%IF &outdn ne _null_ %THEN %DO;
2
PROC SORTDATA=&outdn;
3
BY extname;
4
RUN;
5 Bloc de code
PROC PRINT
Explication : Suite à la `PROC SORT` (si `outdn` n'est pas `_null_`), ce bloc utilise `PROC PRINT` pour afficher le contenu du jeu de données `outdn` dans la sortie SAS. Un titre descriptif est défini pour la sortie de la procédure, puis supprimé après l'exécution. Cela permet de visualiser les fichiers listés et leurs détails (nom complet, nom de fichier, extension) directement dans la sortie SAS.
Copié !
title "The &path contents";
proc print data=&outdn;
run;
title;
%end;
1
title "The &path contents";
2
PROC PRINTDATA=&outdn;
3
RUN;
4
title;
5
%END;
6 Bloc de code
NETTOYAGE & FIN DE MACRO
Explication : Ce bloc final est responsable du nettoyage et de la clôture de la macro. L'instruction `filename filelist clear;` libère le fileref `filelist`, ce qui est une bonne pratique pour éviter les conflits ou l'utilisation accidentelle ultérieure. Enfin, `%mend dirlist;` marque la fin de la définition de la macro `dirlist`.
Copié !
filename filelist clear;
%mend dirlist;
1
filename filelist clear;
2
%mend dirlist;
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 : Name : dirlist.sas
Author: Jun Fang June, 2016
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.