La fonction call system permet dans le cas présent de stocker du code Unix pour rechercher des fichiers dans des répertoires données. Le résultat de la recherche est stocké dans un fichier .txt qui est lu dans une étape data.
1. Créer une macro variable pour stocker le chemin d’accès de la bibliothèque WORK
Le chemin d’accès à la bibliothèque WORK est extrait avec la fonction système PATHNA?E et est stocké dans la macro variable WORKDIR. Ce chemin d’accès sera celui où sera sauvegardé le fichier .txt de la recherche.
%let workdir=%sysfunc(pathname(work));
2. Utiliser call symput pour appeler la commande find d’UNIX
La commande find est suivie de trois composants :
-
le chemin d’accès au(x) fichier(x) d’entrée. L’astérisk indique que tous les sous répertoire du répertoire PROJET sont consultés
- le chemin d’accès au fichier final (ici resultat.txt) où sera stocké le résultat de la recherche. Dans l’exemple, le fichier est stocké de manière temporaire dans le répertoire utilisé par la bibliothèque WORK de SAS.
-
La page anglaise de Wikipedia http://en.wikipedia.org/wiki/Find explique que le code 2>/dev/null supprime des messages d'erreurs liés à des droits d'accès.
« If you’re doing this as a user other than root, you might want to ignore permission denied (and any other) errors. Since errors are printed to stderr, they can be suppressed by redirecting the output to /dev/null. »
Dans le second appel le double >> permet d’ajouter au fichier existant le résultat de la recherche au lieu de remplacer l’ancien.
data _null_; call system ("find c:/projet/*/demographie.sas7bdat > &workdir./resultat.txt 2>/dev/null c:/project/*/laboratoire.sas7bdat >> &workdir./resultat.txt 2>/dev/null"); run;
L’étape data sert à lire le fichier .txt et de la trocker dans un dataset (ici REF) via infile/input. Des options à l’instruction infile peuvent être ajoutées pour lire le fichier correctement.
data ref (keep=); infile "&workdir./resultat.txt" ;*lrecl=2000 truncover firstobs=1; input pathdsn $1-100; run;