SAS/BASE® – Exemples de code

Articles parus

FAQs

  • Exemple – Créer ses propres formats numériques avec l’instruction PICTURE pour un nombre. Réponse
  • Exemple – Créer ses propres formats à partir d'une table. Réponse
  • Comment calculer le nombre de jours ouvrés entre deux dates ? Réponse 
  • Comment mettre à jour une table existante par rapport à une autre table, tout en conservant les indexes ? Réponse 
  • Comment générer une variable numérique ou caractère de manière aléatoire ? 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 
  • 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 
  • Comment déterminer le type d’une variable ? Réponse 
  • Comment isoler les doublons dans un jeu de données ? Réponse 
  • Comment déterminer par programme l'espace libre restant sur un disque ? Réponse 
  • Lister le contenu d'un dossier par programme Réponse 
  • 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 déterminer si une colonne existe dans une table par programme ? Réponse 

Autres FAQs SAS/Base®

Généralités | Procédures, Instructions et Fonctions | Macro-langage | Traitement des fichiers externes | Interface, Log, Output | ODS

Réponses

 

Caractéristiques :
  • 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

Retour Haut


 

Caractéristiques :
  • 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 :

Retour Haut


Caractéristiques :
  • Catégories : SAS/Base
  • OS : Windows, Unix, z/OS
  • Version : 9.3 et au-delà
  • Vérifié en février 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 : Base SAS® 9.3 Procedures Guide, Second Edition, Overview: FCMP Procedure 

Retour Haut


Caractéristiques :
  • Catégories : Base
  • OS : Tous
  • Version : de 8.2 à 9.2
  • Vérifié en février 2011
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 (PDF), TS-250 - DATA Step Programming Using the MODIFY Statement

Retour Haut


Caractéristiques :
  • Catégories : SAS/Base
  • OS : Unix, Windows, z/Os
  • Version : 9 et au-delà
  • Vérifié en décembre 2010

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

Retour Haut


Caractéristiques :
  • Catégories : SAS/Base
  • OS : Unix, Windows, z/OS
  • Version : SAS® 8.2 et au-delà
  • Vérifié en octobre 2009
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

Retour Haut


Caractéristiques :
  • Catégories : SAS/Base
  • OS : Windows
  • Version : SAS® 9.1.3 et 9.2
  • Vérifié en octobre 2010
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.

data mail;
input adress $18. file $20. file2 $20.;
cards;
nom@adress.com    "c:\tests\data.sas" "c:\tests\axis.sas"
nom1@adress1.com  "c:\tests\data.sas" "c:\tests\axis.sas"
nom2@adress2.com  "c:\tests\data.sas" "c:\tests\axis.sas"
nom3@adress3.com  "c:\tests\data.sas" "c:\tests\axis.sas"

;
run;

filename reports email "nom@adress.com";

data _null_ ;
file reports;
length adress $ 30 file $ 21;
set mail;
put '!EM_TO!' adress;
put '!EM_SUBJECT! Report for ' file;
put adress ',';
put 'Report for ' file file2 '.';
put '!EM_ATTACH!' "(" file file2 ")";
put '!EM_SEND!';
put '!EM_NEWMSG!';
put '!EM_ABORT!';
run;

FILENAME Statement, EMAIL (SMTP) Access Method 

Retour Haut


Caractéristiques :
  • Catégories : SAS/Base
  • OS : Non spécifique
  • Version : Non spécifique
  • Vérifié en février 2011
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 (ds=) ;
     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 ;

Aide en ligne :  SAS 9, Allô support n°13

Retour Haut


Caractéristiques :
  • Catégories : SAS/Base
  • OS : Windows
  • Version : SAS® 8.2 et au-delà
  • Vérifié en Mars 2010
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=EXCEL2000 REPLACE ; RUN ;") ;
     run ;
%MEND M_EXPORT;

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.

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

Retour Haut


Caractéristiques :
  • Catégories : SAS/Base
  • OS : Unix, Windows, z/Os
  • Version : SAS 6.12 à SAS 9.2
  • Vérifié le 01/12/2008
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 :

Retour Haut


Caractéristiques :
  • Catégories : SAS/Base
  • OS : Windows
  • Version : SAS® 8.2 et au-delà
  • Vérifié en juillet 2010
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;

Ici, les observations pour lesquelles la variable de groupe apparaît en premier et en dernier en même temps sont supprimées, et donc seuls les doublons seront conservés.

Retour Haut


Caractéristiques :
  • Catégories : SAS/Base
  • OS : Windows
  • Version : SAS® 8.2 et au-delà
  • Vérifié en février 2010
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 

Retour Haut


Caractéristiques :
  • Catégories : SAS/Base
  • OS : Windows
  • Version : SAS® 8.2 et au-delà
  • Vérifié en février 2010
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\SAS\SAS_92" > 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\SAS\" > 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\SAS\SAS_92");
      _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

Retour Haut


Caractéristiques :
  • Catégories : SAS/Base
  • OS : Unix, Windows, z/Os
  • Version : 9.1 et au-delà
  • Vérifié en février 2011
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;

Retour Haut


Caractéristiques :
  • Catégories : SAS/Base
  • OS : Unix, Windows, z/Os
  • Version : SAS® 8.2 et au-delà
  • Vérifié en Février 2011
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 &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;
 

Retour Haut


Caractéristiques :
  • Catégories : SAS/Base
  • OS : Unix, Windows, z/Os
  • Version : 9.1 et au-delà
  • Vérifié en juin 2011
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=2010;
%let fin=2011;

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;

Retour Haut


 

Caractéristiques :
  • Catégories : SAS/Base - Exemples
  • OS : Windows, Unix, z/OS
  • Version : 9.3 et au-delà
  • Vérifié en novembre 2011

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

Retour Haut