SAS/BASE® – Exemples de code
Articles parus
- Une macro pour lire plusieurs fichiers texte - Juin 2007 - SAS 9
FAQs
- Comment remplacer toutes les valeurs manquantes d'une table par 0 ? Réponse
- Comment exporter chaque table d’une bibliothèque dans un classeur Excel ? Réponse
- Via une étape DATA, comment conserver les dix meilleurs résultats (top ten) obtenus par groupe ? Réponse
- Comment, à partir d'une table sas contenant les adresses emails et des chemins de fichiers, peut-on envoyer plusieurs fichiers en pièces jointes d'un mail ? Réponse
- Exemple - Comment générer une variable numérique ou caractère de manière aléatoire ? Réponse
- Exemple - Comment mettre à jour une table existante par rapport à une autre table, tout en conservant les indexes ? Réponse
- Comment déterminer le type d’une variable ? Réponse
- Comment isoler les doublons dans un jeu de données ? Réponse
- Exemple – Comment déterminer par programme l’espace libre restant sur un disque ? Réponse
- Exemple – Lister le contenu d’un dossier par programme Réponse
- Exemple – Déterminer les week-ends par programme Réponse
- Déterminer le nombre de variables d'une table Réponse
- Déterminer les jours fériés par programme Réponse
- Comment calculer le nombre de jours ouvrés entre deux dates ? Réponse
- Exemple – Créer ses propres formats numériques avec l’instruction PICTURE pour un nombre. Réponse
Réponses
- Catégories : SAS/Base
- OS : Non spécifique
- Version : 9.1.3 et au-delà
- Vérifié en novembre 2013
Comment remplacer toutes les valeurs manquantes d'une table par 0 ?
Vous pouvez utiliser un ARRAY qui référencera toutes les variables numériques. L’avantage principal de cette méthode est double :
- Il n’est pas nécessaire de connaître le nom des variables,
- Il n’est pas nécessaire de connaître le nombre de variables.
Le macro-programme ci-dessous prend en paramètre le nom de la table SAS en entrée, et créée une copie de celle-ci.
%Macro M_Zero(mon_dataset);
data &ds.2 (drop=_i);
set &ds ;
array A_VarNum[*] _NUMERIC_ ;
do _i=1 to dim( A_VarNum ) ;
If A_VarNum (_i)=. then A_VarNum (_i)=0 ;
End ;
run ;
%Mend M_Zero;
Pour l'utiliser, exécutez la commande suivante :
%M_Zero(ma_table); /* où ma_table représente le dataset à modifier */
Pour l’utiliser, exécutez la commande suivante :
%M_Zero(ma_table); /* où ma_table représente le dataset à modifier */
Aide en ligne : SAS 9, Allô support n°13
- Catégories : SAS/Base
- OS : Windows
- Version : SAS® 8.2 et au-delà
- Vérifié en Novembre 2013
Comment exporter chaque table d’une bibliothèque dans un classeur Excel ?
Le macro-programme ci-dessous exporte chaque membre de type DATA d’une bibliothèque vers un fichier Excel (un fichier Excel par table SAS).
Liste des paramètres :
· MYLIB : Nom de la bibliothèque où sont stockées les tables SAS
· MYDIR : Nom du répertoire où seront stockés les fichiers MS Excel.
%MACRO M_EXPORT (MyLib, MyDir);
data _null_ ;
set sashelp.vtable (where=(libname=compress(upcase("&MyLib")))) ;
call execute
("PROC EXPORT DATA=" !! compress(libname !! '.' !!memname)
!! " OUTFILE='&MyDir" !! compress(memname !! ".XLS'")
!! " DBMS=EXCELCS REPLACE ; RUN ;") ;
run ;
%MEND M_EXPORT;
%M_EXPORT(SASHELP,C:\) /* export la library SASHELP sur C: */
Pour exporter des données vers Excel avec la procédure EXPORT, il est nécessaire d’avoir une licence pour le module SAS/Access to PC File Formats.
EXCELCS est utilisé dans les environnements 64bits avec SAS PC Files Server. Suivant votre installation vous pourriez utiliser le DBMS=EXCEL ou DBMS=EXCEL2000 : http://support.sas.com/kb/33/228.html
Par ailleurs, la SAS Note SN-006695, "How to export multiple SAS data sets to multiple sheets in Excel", propose de télécharger des programmes concernant l'export de données SAS vers Excel.
Aide en ligne : SAS 9 : PROC EXPORT, CALL EXECUTE, Allô support n° 14
- Catégories : SAS/Base
- OS : Unix, Windows, z/OS=
- Version : SAS® 8.2 et au-delà
- Vérifié en novembre 2013
Via une étape DATA, comment conserver les dix meilleurs résultats (top ten) obtenus par groupe ?
L'idée est de créer un compteur, par groupe, et de ne garder que les valeurs inférieures ou égales à dix.
Prenons un exemple : comment conserver les dix meilleures ventes de chaque pays, dans la table sashelp.prdsale ?
/* Tri de la table, par pays et valeur décroissante des ventes */
proc sort data = sashelp.prdsale out=prdsale_tri;
by country descending actual;
run;
/*Création du compteur, réinitialisé à chaque nouveau groupe et extraction des dix premières valeurs de ce compteur, pour chaque groupe */
data top_ten(drop=cpt);
retain cpt 0;
set prdsale_tri;
by country;
cpt=cpt+1;
if first.country then cpt=1;
if cpt <=10 then output;
run;
Aide en ligne : How the DATA Step Identifies BY Groups
- Catégories : SAS/Base
- OS : Windows
- Version : SAS® 9.1.3 et au-delà
- Vérifié en Novembre 2013
Comment, à partir d'une table sas contenant les adresses emails et des chemins de fichiers, peut-on envoyer plusieurs fichiers en pièces jointes d'un mail ?
Voici un exemple de code SAS permettant de transmettre plusieurs fichiers par messagerie.
La table "mail" contient les adresses ainsi que les chemins des fichiers à transmettre.
/* dataset décrivant quels fichiers doivent être envoyés
et à quelles personnes */
data mail;
input adresse $21. file1 $31. file2 $32.;
cards;
nom0@mon_adresse.com "C:\temp\mon_fichier.txt" "C:\temp\mon_fichier2.txt"
nom1@mon_adresse.com "D:\Le_rapport.csv" "F:\les_donnees_2014.xlsx"
nom2@mon_adresse.com "C:\partage\Contenu.doc" "F:\le_programme.sas"
nom3@mon_adresse.com "C:\partage\Super_rapport.pdf" "Z:\liste_des_utilisateurs.txt"
;
run;
filename reports email "expediteur@adresse.com";
/* envoi du mail */
data _null_ ;
file reports;
length adresse $ 30 file1 $ 21;
set mail; /* on récupère la liste des emails */
put '!EM_TO!' adresse;
put '!EM_SUBJECT! Mails contenant les fichiers ' file1 file2;
put adresse ',';
put 'Voici les fichiers : ' file1 file2 '.';
put '!EM_ATTACH!' "(" file1 file2 ")";
put '!EM_SEND!';
put '!EM_NEWMSG!';
put '!EM_ABORT!';
run;
Note : Pour que cette méthode fonctionne, vous devez avoir paramétré l’envoi de mail dans le fichier sasv9.cfg (-emailsys, -emailhost et –emailport)
Aide en ligne : FILENAME Statement, EMAIL (SMTP) Access Method
- Catégories : SAS/Base
- OS : Unix, Windows, z/Os
- Version : 9 et au-delà
- Vérifié en novembre 2013
Exemple - Comment générer une variable numérique ou caractère de manière aléatoire ?
Pour générer un numérique aléatoire, vous pouvez utiliser la fonction RANUNI.
Exemples :
data aleatoire;
Length var1 $ 10;
Var1=ranuni(0);
Var1=20*ranuni(0);
Var1=ceil (32*ranuni(0));
run;
- Pour générer une variable caractère contenant des chiffres et des lettres, vous pouvez utiliser ce programme :
data aleatoire;
Length var1 $ 10;
do j=1 to 10;
var1=compress(var1)||trim(scan('A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S,T,U,V,W,X,Y,Z,0,1,2,3,4,5,6,7,8,9', ceil(36*ranuni(0))));
end;
run;
- Pour générer une variable caractère contenant uniquement des lettres, vous pouvez utiliser le programme ci-dessus, en ne gardant que l'alphabet dans la première partie de la fonction SCAN, comme ceci :
data aleatoire;
Length var1 $ 10;
do j=1 to 10;
var1=compress(var1)||trim(scan('A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S,T,U,V,W,X,Y,Z', ceil(26*ranuni(0))));
end;
run;
Aide en ligne : Ranuni
- Catégories : Base
- OS : Tous
- Version : de 8.2 à 9.4
- Vérifié en novembre 2013
Exemple - Comment mettre à jour une table existante par rapport à une autre table, tout en conservant les indexes ?
Voici un exemple :
/* La table « maitresse » */
data BIG ;
X = 1 ; Y = 'A' ; output ;
X = 2 ; Y = 'B' ; output ;
X = 3 ; Y = 'C' ; output ;
run ;
/*Creation de l'index */
proc datasets lib=work nolist ;
modify BIG ;
index create X ;
quit ;
/* Dans la table SMALL,
l'observation avec X=3 doit être mise à jour,
celle avec X=999 est une nouvelle observation */
data SMALL ;
X = 3 ; Y = 'Z' ; output ;
X = 999 ; Y = 'Z' ; output ;
run ;
/*Creation l'index */
proc datasets lib=work nolist ;
modify SMALL ;
index create X ;
quit ;
/* Mise à jour de la table "maitresse". L'index est conservé. */
data BIG;
set SMALL(rename=(Y=tY));
by X;
modify BIG key=X;
if _iorc_=%sysrc(_sok) then do;
Y=tY;
_error_=0;
put 'in replace';
replace BIG;
end;
else if (%sysrc(_dsenom)) then do;
_error_=0;
Y=tY;
put 'in insert';
output BIG;
end;
run;
Aide en ligne : Sample 25453: Creating and modifying tables and views, SUGI 30 - Frequently Asked Questions about SAS® Indexes, TS-250 - DATA Step Programming Using the MODIFY Statement
- Catégories : SAS/Base
- OS : Unix, Windows, z/Os
- Version : SAS 6.12 à SAS 9.4
- Vérifié en novembre 2013
Comment déterminer le type d’une variable ?
C’est possible en utilisant la fonction VARTYPE ou la procédure CONTENTS.
Exemple 1 : en macro-language, avec VARTYPE
%global vart ; %macro TypeVariable (dsIN=_last_); %let vart=; %let dsid=%sysfunc (open (&dsIN)) ; %let varnum=%sysfunc(varnum(&dsid,AGE)); %let vart=%sysfunc(vartype(&dsid,&varnum)) ; %let dsid=%sysfunc (close (&dsid)) ; %mend ; %TypeVariable (dsIN=sashelp.class); %put vart=&vart ;
Exemple 2 : en SAS/Base, avec VARTYPE
%let vart=;
data _null_ ;
dsid=open("sashelp.class","i");
num=varnum(dsid,'AGE') ;
type=vartype(dsid,num) ;
call symput ("vart", type) ;
dsid=close (dsid) ;
run ;
%put vart=&vart ;
Exemple 3 : en SAS/Base, avec la procédure CONTENTS
%let vart=;
proc contents data=sashelp.class noprint out=_contents ;
run ;
data _null_ ;
set _contents (where=(upcase (compress(name))='HEIGHT'));
call symput ("vart", type) ;
run ;
%put vart=&vart ;
Aide en ligne : fonction VARTYPE, Procédure CONTENTS
- Catégories : SAS/Base
- OS : Windows
- Version : SAS® 8.2 et au-delà
- Vérifié en novembre 2013
Comment isoler les doublons dans un jeu de données ?
Cette question peut se poser lors de l’utilisation de la PROC SORT et de son option NODUPKEY, qui permet de conserver uniquement la première observation lorsque la variable de tri contient plusieurs observations pour une même valeur. Si des observations sont effectivement supprimées par la procédure sort, il peut être intéressant d’aller vérifier lesquelles.
Donc pour isoler les observations apparaissant plusieurs fois dans une table (doublons, voire plus), une technique consiste à utiliser les variables automatiques FIRST et LAST. La variable indicatrice FIRST prend la valeur 1 pour la première observation de chaque groupe (donc chaque valeur de la variable indiquée dans l’instruction by) et 0 autrement. De même, la variable LAST prend la valeur 1 pour la dernière observation de chaque groupe.
Au niveau du code à utiliser, cela donne donc :
data mesDoublons; set maBase; /* la table doit être au préalable triée sur la variable de groupe */ by maVariable; if (first.maVariable =1 and last.maVariable =0) or (first.maVariable =0 and last.maVariable =1) or (first.maVariable =0 and last.maVariable =0); run;
Seront ainsi sélectionnées les observations pour lesquelles la variable de groupe apparaît :
- en premier, mais pas en dernier en même temps
- en dernier, mais pas en premier en même temps
- ni en premier, ni en dernier
Une autre façon d'obtenir le même résultat, en n'utilisant qu'une seule condition, est :
data mesDoublons; set maBase; by maVariable; if (first.val=1 and last.val=1) then delete; run;
- Catégories : SAS/Base
- OS : Windows
- Version : SAS® 8.2 et au-delà
- Vérifié en novembre 2013
Exemple – Comment déterminer par programme l’espace libre restant sur un disque ?
Le programme ci-dessous donne un exemple de code pour afficher dans la log l’espace libre restant. Il utilise la commande DOS dir pour le déterminer.
%macro EspaceLibre (drive=) ; filename Espace pipe "dir /AD /-C ""&drive.:/"""; data _null_; infile Espace end=last; input; Format EspaceLibre commax32.2 ; if last then do; EspaceLibre=input(scan(_infile_,3,' '),17.) / (1024*1024); put "== INFO == Espace libre sur &drive : " EspaceLibre " Mo."; end; run; %mend ; %EspaceLibre (drive=C) ;
Aide en ligne : Instruction Filename
- Catégories : SAS/Base
- OS : Windows, Unix
- Version : SAS® 8.2 et au-delà
- Vérifié en novembre 2013
Exemple – Lister le contenu d’un dossier par programme
Il existe différentes manières de lister le contenu d’un dossier en programmation.
- La première consiste à utiliser les commandes système via le FILENAME PIPE.
Exemple : Sous Windows, créer un fichier contenant le résultat de la commande DIR
options ls=132 obs=max;
filename Contenu pipe 'dir "C:\Program Files\" > c:\temp\Contenu.txt';
data _null_;
length text $132;
infile Contenu truncover;
input text 1-132;
put text=;
run;
La log affiche :
NOTE: The infile CONTENU is:
Unnamed Pipe Access Device,
PROCESS=dir "C:\Program Files\" > c:\temp\Contenu.txt,
RECFM=V,LRECL=256
NOTE: 0 records were read from the infile CONTENU.
- La seconde consiste à utiliser les fonctions SAS dédiées à la lecture de répertoires, telles que DOPEN.
Exemple : créer une table contenant le nom de chaque dossier et fichier d'un dossier donné
data Contenu (drop=_:);
length fichier $300.;
_rc=filename("mydir","C:\Program Files\");
_did=dopen("mydir");
if _did=<0 then stop;
_NbFiles=dnum(_did);
If _NbFiles ne 0 then do _i=1 to _NbFiles;
fichier=dread(_did, _i);
output ;
end;
_did=dclose(_did);
run ;
Aide en ligne : fonction DOPEN
- Catégories : SAS/Base
- OS : Unix, Windows, z/Os
- Version : 9.1 et au-delà
- Vérifié en novembre 201
Exemple – Déterminer les week-ends par programme
Le programme ci-dessous créée une table à 2 variables : d’une part la date, d’autres part le jour de la semaine (lorsqu’il s’agit d’un samedi ou d’un dimanche). Cette table contient toutes les dates correspondant à un samedi ou un dimanche pour une période donnée.
options dflang = "french" ;
%let debut=2010 ;
%let fin=2011;
data WeekEnds (keep=date descr );
attrib date length=5. format=eurdfwkx. ;
attrib Descr length=$20. ;
do year=&debut to &fin ;
/* On détermine d'abord le 1er week-end de la période */
Date=INTNX('WEEK.7', mdy (1, 1, year), 0, 'B') ; Descr="Samedi" ; If year(date) = year then output ;
Date +1 ; Descr="Dimanche" ; If year(date) = year then output ;
/* Puis on boucle sur les semaines : pour une date donnée on ajoute une semaine, jusqu'à atteindre la fin de la période */
Date=mdy (1, 1, year) ;
do while (year (date) = year) ;
Date=INTNX('WEEK.7',date, +1, 'B') ;Descr="Samedi" ;
If year(date) = year then output ;
Date +1 ; Descr="Dimanche" ;
If year(date) = year then output ;
end ;
end;
run;
- Catégories : SAS/Base
- OS : Unix, Windows, z/Os
- Version : SAS® 8.2 et au-delà
- Vérifié en novembre 2013
Exemple – Déterminer le nombre de variables d’une table
Il existe plusieurs manières de déterminer le nombre de variable d’une table. Voici 2 exemples où le nombre de variable est stocké dans la macro-variable NVARS.
Exemple en macro-language :
%global nvars ;
%macro NbVariables (dsIN=_last_);
%let nvars=;
%let dsid=%sysfunc (open (&dsIN));
%let nvars=%sysfunc (attrn (&dsid, nvars));
%put nombre de variable : &nvars;
%let dsid=%sysfunc (close (&dsid));
%mend ;
%NbVariables (dsIN=sashelp.class);
Exemple en langage SAS/Base :
proc contents data=sashelp.class noprint out=_contents ;
run ;
proc sort data=_contents ;
by descending varnum ;
run ;
data _null_ ;
set _contents (obs=1);
call symput ("nvars", varnum) ;
run ;
- Catégories : SAS/Base
- OS : Unix, Windows, z/Os
- Version : 9.1 et au-delà
- Vérifié en Novembre 2013
Exemple – Déterminer les jours fériés par programme
Le programme ci-dessous crée une table à 2 variables : d’une part la date, d’autre part la description du jour férié ou bien le jour de la semaine lorsqu’il s’agit du week-end.
options dflang = "french" ;
%let debut=2013;
%let fin=2014;
data JoursFeries (keep=date descr );
attrib date length=5. format=eurdfwkx. ;
attrib Descr length=$20. ;
do year=&debut to &fin ;
/* Jours fériés fixes */
Date=mdy (1, 1, year) ; Descr="Jour de l'an" ; output ;
Date=mdy (5, 1, year) ; Descr="Fête du travail" ; output ;
Date=mdy (5, 8, year) ; Descr="Fête de la Victoire 1945" ; output ;
Date=mdy (7, 14, year) ; Descr="Fête nationale" ; output ;
Date=mdy (8, 15, year) ; Descr="Assomption" ; output ;
Date=mdy (11, 1, year) ; Descr="Toussaint" ; output ;
Date=mdy (11, 11, year) ; Descr="Armistice de 1918" ; output ;
Date=mdy (12, 25, year) ; Descr="Noël" ; output ;
/* Pâques */
c=int(year/100);
n=year-(19*int(year/19));
k=int((c-17)/25);
i=c-int(c/4)-int((c-k)/3)+(19*n)+15;
i=i-(30*int(i/30));
i=i-(int(i/28)*(1-int(i/28)*int(29/(i+1))*int((21-n)/11)));
j=year+int(year/4)+i+2-c+int(c/4);
j=j-(7*int(j/7));
month=3+int((i-j+40)/44);
day=i-j+28-(31*int(month/4));
date=mdy(month,day,year); Descr="Dimanche de Pâques" ; output ;
date +1; Descr="Lundi de Pâques" ; output ;
/* Ascension 40 jours après Pâques */
date +38 ; Descr="Ascension" ; output ;
/* Pentecôte 11 jours après l'ascension */
date +10 ; Descr="Pentecôte" ; output ;
date +1 ; Descr="Lundi de Pentecôte" ; output ;
end;
run;
- Catégories : SAS/Base
- OS : Unix, Windows, z/Os
- Version : 9.1 et au-delà
- Vérifié en Novembre 2013
Comment déterminer si une colonne existe dans une table par programme ?
Dans cet exemple, nous créons un macro-programme qui prend 2 paramètres en entrée :
- Le nom de la table sous la forme bibliothèque.nom
- La variable à tester.
Le programme vérifie dans un premier temps si la table existe, puis vérifie la présence de la colonne. La réponse est ensuite donnée dans la log.
Programme :
%macro VerifVarname (DSName=, Varname=);
%let dsid=%sysfunc (open (&DSName)) ;
%if &dsid eq 0 %then %do ;
%put ERROR: La table &DSName n existe pas !;
%GOTO exit ;
%end ;
%let Verif=%sysfunc (varnum (&dsid, &Varname)) ;
%if &Verif=0 %then %put La variable &varname n est pas dans la table &DSName ;
%else %put La variable &varname est dans la table &DSName ;
%let dsid=%sysfunc (close (&dsid)) ;
%exit: %mend ;
/* Exemple d'appel : */
%VerifVarname (DSName=sashelp.class, Varname=Prenom) ;
%VerifVarname (DSName=sashelp.class, Varname=Name) ;
Résultat dans le journal :
La variable Prenom n est pas dans la table sashelp.class La variable Name est dans la table sashelp.class
- Catégories : SAS/Base
- OS : Windows, Unix, z/OS
- Version : 9.3 et au-delà
- Vérifié en novembre 2013
Comment calculer le nombre de jours ouvrés entre deux dates ?
Il faut dans un premier temps avoir une table référençant les jours fériés. Ensuite, on crée une fonction qui permet de calculer le nombre de jours. Il ne reste plus qu’à utiliser cette fonction dans une étape data.
Afin d’avoir la table des jours fériés, vous pouvez reprendre la table en sortie de la FAQ : Déterminer les jours fériés par programme
Il est à noter que la longueur de la variable date devra être de 8 au lieu de 5 dans la FAQ :
attrib date length=8. format=eurdfwkx. ;
/*
**************************************************************************
* On crée une fonction SAS *
**************************************************************************
/*
proc fcmp outlib=work.myfuncs.dates;
function networkdays(d1,d2,holidayDataset $,dateColumn $);
/* On vérifie date début < date fin */
start_date = min(d1,d2);
end_date = max(d1,d2);
/* On charge la table des jours fériés en mémoire */
array holidays[1] / nosymbols;
if (not missing(holidayDataset) and exist(holidayDataset)) then
rc = read_array(holidayDataset, holidays, dateColumn);
else put "NOTE: networkdays(): No Holiday data considered";
/* INTCK compte les jours en incluant les bornes, d'où le -1 */
if (1 < weekday(start_date)< 7) then start_date = start_date-1;
diff = intck('WEEKDAY', start_date, end_date);
do i = 1 to dim(holidays);
if (1 < weekday(holidays[i])< 7) and
(start_date <= holidays[i] <= end_date) then
diff = diff - 1;
end;
return(diff);
endsub;
run; quit;
options cmplib=work.myfuncs;
/*
**************************************************************************
* Test de la fonction *
**************************************************************************
/*
data test;
length dates 8;
format dates date9.;
infile datalines dsd;
input dates : date9.;
workdaysSince = networkdays(dates, today(), "work.Joursferies","date");
datalines;
20OCT2013
;
Aide en ligne : FCMP Procedure
Article : Creating custom SAS functions with the FCMP Procedure
- Catégories : Base
- OS : Windows, Unix, z/OS=
- Version : Toutes les versions
- Vérifié en décembre 2013
Exemple – Créer ses propres formats numériques avec l’instruction PICTURE pour un nombre.
Cet exemple illustre l’utilisation des mots-clés 0 et 9 : 9 force l’affichage d’un chiffre, tandis que 0 indique sa position sans forcer d’affichage.
Ici, la multiplication par 100 est nécessaire pour le respect des décimales, dont on force l’affichage par la notation 9,99.
PROC FORMAT ; PICTURE Nombre low - 0 = '0 000 000 000 009,99' (mult=100 prefix='-') 0 - high = '0 000 000 000 009,99' (mult=100); RUN; data _null_ ; format num Nombre. ; num=123456 ; put num ; num=12345678.96 ; put num ; num=-7418.52 ; put num ; run ;
Résultat dans le journal :
123 456,00 12 345 678,96 -7 418,52
- Catégories : Base
- OS : Windows, Unix, z/OS=
- Version : Toutes les versions
- Vérifié en décembre 2013
Exemple – Créer ses propres formats à partir d’une table
Outre les instructions PICTURE et VALUE, la procédure FORMAT permet également de créer un format à partir d’une table via l’option CNTLIN.
La table en entrée doit respecter une structure précise et contenir au minimum ces colonnes :
- FMTNAME : nom du format, qui doit commencer par le signe $ pour les formats caractères
- START : valeur brute ou début d’une tranche
- END : valeur de fin de tranche
- LABEL : texte à afficher
Le programme ci-dessous permet de créer le format JudoF., qui donne la catégorie de judo en fonction du poids, et illustre son utilisation sur un jeu de données.
Dans cet exemple nous utilisons également la variable HLO (pour High / Low / Otherwise), qui permet de déclarer un attribut pour une valeur, comme la notion de « autres » par exemple qui permet d’afficher un texte particulier pour toute valeur qui ne serait pas définie dans le format.
/*Création de la table de référence contenant les valeurs brutes et leur libellés */
data CategoriesJudoFemmes ;
input sexe $1. debut fin libelle $25.;
cards ;
F 48 48 super-légers
F 48 52 mi-légers
F 52 57 légers
F 57 63 mi-moyens
F 63 70 moyens
F 70 78 mi-lourds
F 78 78 lourds
;
run ;
/* Transformation de la table de référence pour respecter les noms de colonnes à utiliser pour l'option CNTLIN, et également ajouter le nom du format et la valeur "autres" */
data fmt ;
set CategoriesJudoFemmes (rename=(debut=start fin=end libelle=label)) end=last ;
if _N_=1 then HLO='L' ; /* signifie que start=Low*/
if last then HLO='H' ; /* signifie que end=High*/
fmtname="JudoF" ; /* Nom du format */
label=propcase (label) ; /* Changement de la casse pour le libellé*/
output ;
/* Création d'une valeur "Autres cas" */
if last then do ;
HLO='O' ;
label="Inconnu" ;
output ;
end ;
run ;
La table en entrée de la PROC format est donc la suivante :

/* Création du format */ proc format cntlin=fmt ; run ; /* Exemple d'utilisation du format */ data Judokates ; attrib Prenom label="Prénom" length=$40. ; attrib Poids length=3. format=JudoF. ; input Prenom $ Poids ; cards ; Annabelle 45 Alice 70 Barbara 60 Coralie . Déborah 95 ; run ; proc print ; run ;
Résultat :
