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`.
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é !
%else %do;
proc printto;
run;quit;
PROC SQL noprint;
select
text
,countc(Text,'|')
into
:_ttl TRIMMED
,:_col
from
Dictionary.Titles
where
Type="T" & Number=1;
quit;
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é !
data _null_;
infile "%sysfunc(pathname(work))/_tmp1_.txt" length=l;
file "%sysfunc(pathname(work))/_tmp2_.txt" ;
input lyn $varying32756. l;
if _n_=1 then do;
put lyn;
putlog lyn;
end;
else do;
if countc(lyn,'|')=&_col then do;
put lyn;
putlog lyn;
end;
end;
run;quit;
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`).
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é !
data &outdsn;
set &intermediate;
array chr _character_;
if substr(chr[1],1,5)=' ' or substr(chr[1],1,5)='-----' then delete;
run;quit;
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.
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.
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.