Publié le :
Macro CREATION_INTERNE

Macro utilitaire pour convertir une sortie ODS en table SAS

En attente de validation
Attention : Ce code nécessite des droits administrateur.
La macro `utl_odsTbx` est conçue pour parser une sortie texte tabulaire (généralement issue d'une procédure SAS©) et la convertir en une table SAS© structurée. Elle fonctionne en deux modes distincts, contrôlés par la valeur du paramètre `outdsn`.
1. Mode 'SETUP' : Si `outdsn` est égal à 'SETUP', la macro prépare l'environnement pour capturer la sortie des procédures SAS© qui suivront. Elle redirige toute la sortie ODS vers un fichier texte temporaire (`_tmp1_.txt`) en utilisant `PROC PRINTTO`.
2. Mode de traitement : Si `outdsn` est un nom de table, la macro traite le fichier texte précédemment généré. Elle détermine d'abord le nombre de colonnes attendu en se basant sur les métadonnées de la dernière procédure exécutée (via `Dictionary.Titles`). Ensuite, elle filtre le fichier texte pour ne garder que l'en-tête et les lignes de données valides. `PROC IMPORT` est utilisé pour lire ce fichier nettoyé dans une table SAS© intermédiaire. Une dernière étape de nettoyage supprime les lignes de séparation restantes. Enfin, la macro nettoie les attributs de la table finale et supprime les fichiers temporaires. Elle dépend des macros `%utl_close` et `%utlfkil` qui ne sont pas définies dans ce code.
Analyse des données

Type : CREATION_INTERNE


La source principale est la sortie d'une procédure SAS précédente, qui a été capturée dans un fichier texte via `PROC PRINTTO`. La macro utilise également le dictionnaire `Dictionary.Titles` (similaire à SASHELP) pour obtenir des métadonnées sur la sortie (titre et nombre de colonnes) afin de parser le fichier correctement.

1 Bloc de code
Macro Logic (%if)
Explication :
Ce bloc initialise la macro. Il supprime la table de sortie si elle existe. Si le paramètre `outdsn` est 'SETUP', il prépare la capture de la sortie ODS : il supprime un fichier temporaire, ajuste les options système (`OPTIONS`), et redirige la sortie vers le fichier `_tmp1_.txt` avec `PROC PRINTTO`.
Copié !
1%macro utl_odsTbx(outdsn,intermediate=_temp);
2 %utl_close;
3 PROC DATASETS lib=work nolist; *just in case;
4 delete &outdsn;
5 RUN;QUIT;
6 %IF %qupcase(&outdsn)=SETUP %THEN %DO;
7 %utlfkil(%sysfunc(pathname(work))/_tmp1_.txt);
8 OPTIONS ls=max ps=32756 FORMCHAR='|' nodate nocenter;
9 PROC PRINTTO PRINT="%sysfunc(pathname(work))/_tmp1_.txt" new;
10 RUN;QUIT;
11 %END;
2 Bloc de code
PROC SQL
Explication :
Si le mode n'est pas 'SETUP', ce bloc restaure d'abord la sortie standard. Ensuite, il utilise `PROC SQL` pour interroger `Dictionary.Titles` afin de récupérer le titre et le nombre de délimiteurs '|' de la dernière sortie de procédure. Ces valeurs sont stockées dans les variables macro `_ttl` et `_col`.
Copié !
1 %ELSE %DO;
2 PROC PRINTTO;
3 RUN;QUIT;
4 PROC SQL noprint;
5 select
6 text
7 ,countc(Text,'|')
8 into
9 :_ttl TRIMMED
10 ,:_col
11 from
12 Dictionary.Titles
13 where
14 Type="T" & Number=1;
15 QUIT;
3 Bloc de code
DATA STEP Data
Explication :
Ce DATA step lit le fichier texte brut capturé (`_tmp1_.txt`) et écrit un nouveau fichier nettoyé (`_tmp2_.txt`). Il conserve la première ligne (considérée comme l'en-tête) et uniquement les lignes de données qui contiennent le nombre correct de délimiteurs, déterminé à l'étape précédente.
Copié !
1 DATA _null_;
2 INFILE "%sysfunc(pathname(work))/_tmp1_.txt" LENGTH=l;
3 file "%sysfunc(pathname(work))/_tmp2_.txt" ;
4 INPUT lyn $varying32756. l;
5 IF _n_=1 THEN DO;
6 put lyn;
7 putlog lyn;
8 END;
9 ELSE DO;
10 IF countc(lyn,'|')=&_col THEN DO;
11 put lyn;
12 putlog lyn;
13 END;
14 END;
15 RUN;QUIT;
4 Bloc de code
PROC IMPORT Data
Explication :
`PROC IMPORT` lit le fichier texte nettoyé (`_tmp2_.txt`) en utilisant le délimiteur '|'. Il crée une table SAS intermédiaire (`&intermediate`) en utilisant la première ligne du fichier pour les noms de variables (`getnames=yes`).
Copié !
1 PROC IMPORT
2 datafile="%sysfunc(pathname(work))/_tmp2_.txt"
3 dbms=dlm
4 out=&intermediate(drop=var:)
5 replace;
6 delimiter='|';
7 getnames=yes;
8 RUN;QUIT;
5 Bloc de code
DATA STEP Data
Explication :
Ce DATA step crée la table SAS finale (`&outdsn`) en copiant la table intermédiaire. Il effectue un nettoyage final en supprimant les lignes dont la première variable texte commence par des espaces ou des tirets, typiques des lignes de séparation ODS.
Copié !
1 DATA &outdsn;
2 SET &intermediate;
3 array chr _character_;
4 IF substr(chr[1],1,5)=' ' or substr(chr[1],1,5)='-----' THEN delete;
5 RUN;QUIT;
6 Bloc de code
PROC DATASETS
Explication :
Ce bloc finalise le traitement. Il supprime les fichiers texte temporaires, puis utilise `PROC DATASETS` pour réinitialiser tous les labels, formats et informats de la table finale. Enfin, il restaure l'option `formchar` à sa valeur par défaut et termine la macro.
Copié !
1 %utlfkil(%sysfunc(pathname(work))/_tmp1_.txt);
2 %utlfkil(%sysfunc(pathname(work))/_tmp2_.txt);
3 PROC DATASETS lib = work nodetails nolist;
4 modify &outdsn ;
5 attrib _all_ label = "" ;
6 FORMAT _all_;
7 informat _all_;
8 RUN ;
9 QUIT ;
10 %END;
11 options formchar='|----|+|---+=|-/\<>*';
12 %utl_close;
13%mend utl_odstbx;
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.