Archive for the ‘proc options’ Category

h1

Quel format a la pole position? (FMTSEARCH)

septembre 13, 2008

Sous SAS, les formats appliqués à une variable servent, entre autres, à rendre une information un peu plus compréhensible par l’oeil humain. Ces formats peuvent provenir de plusieurs sources. Il est important de savoir laquelle est privilégiée si plusieurs locations contiennent le même nom de format avec le même type (pour variable caractère ou numérique). L’option globale FMTSEARCH se charge de définir l’ordre privilégié.

Les sources disponibles : Par défaut, SAS dispose d’une série de formats (Liste disponible sur la documentation en ligne). L’utilisateur peut lui aussi créer ses propres formats sauvegardés de manière temporaire (dans la bibliothèque WORK) ou permanent (dans des bibliothèques définies par lui-même).

Exemple d’application : vous pouvez définir des formats communs à tous vos projets. Si un projet est particulier, vous pourrez définir un autre format portant le même nom que celui plus globale et demander qu’il soit privilégié.

Rappel : Pour revoir quelques notions de base sur les formats vous pouvez consultez ces trois articles:

Dans cet article, la notion de bibliothèque est requise. Vous pouvez vous reporter à l’article suivant si vous débutez :

1. Par défaut, il y a deux bibliothèques disponibles

La procédure affiche dans la log la valeur prise par les options globales. L’option OPTION réduit l’affichage à la seule option FMTSEARCH.

proc options option=fmtsearch;
run;

Il apparaît alors que les deux bibliothèques considérées par SAS sont WORK en priorité et les formats standards de SAS en second.

FMTSEARCH=(WORK LIBRARY)
List of catalogs to search for formats and informats

En exécutant l’instruction OPTIONS ci-dessous, l’ordre de priorité est changé.

options fmtsearch(library work);

Après une nouvelle exécution de la procédure PROC OPTIONS, le programmeur peut visualiser le changement.

Voir le résultat :

proc options option=fmtsearch;
run;

Contenu de la log :

FMTSEARCH=(LIBRARY WORK)
List of catalogs to search for formats and informats

2. Ajouter des bibliothèques

Des formats sauvegardés dans des fichiers catalogues : Les formats sont stockés dans des fichiers appelés FORMAT CATALOG. Il faudra que ces fichiers portent un nom FORMATS et l’extension pour désigner un catalogue.

Assigner la bibliothèque contenant le catalogue : Pour considérer des FORMAT CATALOG permanents définis par l’utilisateur, il faut désigner le chemin d’accès au fichier par un nom de bibliothèque (instruction LIBNAME) et ajouter ce nom dans la bibliothèque dans la liste de FMTSEARCH.

Exemple : Dans l’exemple qui suit, un format nommé GENDER est sauvegardé dans le fichier FORMATS.CATALOG au niveau de C:/SASREF, chemin pointé par la bibliothèque SASREF.

libname sasref ‘C:/sasref’;

proc format lib=sasref;
value gender 1=‘MALE’
2=‘FEMALE’;
run;

Puis ce format aura la priorité sur tout autre format GENDER créé de manière temporaire.

options fmtsearch=(sasref work library);

Voir le résultat :

proc options option=fmtsearch;
run;

Contenu de la log :

FMTSEARCH=(SASREF WORK LIBRARY)
List of catalogs to search for formats and informats

3. Important : La priorité de la bibliothèque WORK en cas d’omission.

Les deux exemples suivant donnent le même résultat car la bibliothèque temporaire est mise en priorité si elle n’est pas citée.

options fmtsearch=(work sasref library);
options fmtsearch=(sasref library);

WORK n’est pas ignoré comme pourrait le suggérer l’affichage dans la log ou mise en dernier.

Voir le résultat :

proc options option=fmtsearch;
run;

Contenu de la log :

FMTSEARCH=(SASREF LIBRARY)
List of catalogs to search for formats and informat

h1

Il était une fois la LOG

juin 23, 2008

La fenêtre LOG (ou JOURNAL pour la version française de SAS) contient des informations plus ou moins détaillées sur le travail effectué par SAS. Ces informations peuvent être sauvegardées dans un fichier externe ou être supprimées lors de l’exécution du programme.

1. Une LOG plus ou moins détaillée

Deux situations se présentent :

  • lire les détails de l’exécution d’une macro
  • accéder aux détails d’un fichier .sas inclus dans un autre programme (%INCLUDE…)

Changer les options par défauts : les options MPRINT, MLOGIC et SYMBOLGEN s’adresse à la macro et SOURCE2 au programme inclus. Par défaut, ces options sont désactivées. Elles ont pour but d’aider le programmeur au stade du développement.

Voir le statut actuel des options : pour connaître l’état actuel d’une de ces options, il faut consulter la log après avoir exécuté la procédure options.

proc options;
run;

Remettre les options dans leur état initial : pour désactiver ces options, on utilise NOMPRINT, NOMLOGIC, NOSYMBOLGEN et NOSOURCE2.

Exemple, partie 1 : Le fichier main_include.sas contient l’instruction OPTIONS, le format AGE et la macro RAPPORT.

options source2 mprint mlogic symbolgen;

proc format;
   value age
   11-13 = ’11-13′
   14-16 = ’14-16′
   other = ‘Autre’;
run;

%macro rapport (dsn=);
proc report data=&dsn;
   columns name age sex;
   define name /‘Nom’ display;
   define age  /‘Age’ display ;
   define sex  /‘Sexe’ display;
   format age age.;
run;
%mend rapport;

Exemple, partie 2 : Dans un second programme, le premier programme et la macro RAPPORT sont appelés.

%include ‘C:/sasref/main_include.sas’;
%rapport (dsn=sashelp.class);

2. Commander la suppression du contenu de la LOG

Sous Windows, par défaut, à chaque nouvelle exécution d’un programme, la log grossie. Pour la vider, il y a deux possibilités : une manuelle et une automatique.

Après avoir activé la fenêtre log en la sélectionnant, il y a trois choix possibles :

  • Combiner les touches clavier Ctrl et E (raccourci clavier CTRL+E)
  • Sélectionner menu Edit/Clear All.
  • Taper la commande log;clear; dans le cadre en haut à gauche de l’écran

Cela marche aussi avec les fenêtres OUTPUT et EDITOR. Remplacez seulement le mot LOG par OUTPUT ou EDITOR pour la commande.

Pour une action automatique, l’instruction DM permet d’inclure dans le programme les mots-clés donné jusqu’à présent dans le cadre pour les commandes.

proc print data=sashelp.class;
run;

dm ‘log;clear;’;

3. Sauvegarder le contenu de la LOG dans un fichier externe

Rediriger le contenu de la log : la procédure PROC PRINTTO permet de rediriger le contenu de la log dans un fichier externe. Pour cela, le nom du fichier à créer et son chemin d’accès sont définis dans LOG=. Au choix, l’extension du fichier est .log ou .txt.

Rediriger le listing : le contenu de la fenêtre OUTPUT peut-être aussi redirigé. Cette fois-ci, il faut utiliser FILE=.

Ecraser les anciens fichiers : pour effacer le contenu d’un précédent fichier, il y a l’option NEW dans l’instruction PROC PRINTTO.

Réinitialisation : pour réactiver les destinations par défaut, la procédure sans argument est soumise à SAS.

proc printto log=‘C:/sasref/class.log’ new;
run;

proc printto file=‘C:/sasref/class.txt’ new;
run;

proc print data=sashelp.class;
run;

proc printto;
run;

h1

Créer une date SAS de 3 manières

avril 28, 2008

Le langage SAS utilise sa propre échelle de temps. Dans un premier temps, je vous rappèle comment est définie une date, une heure et une combinaison de l’heure et du jour. Puis, je vous propose trois alternatives pour convertir ou créer ces valeurs.

1. Rappel sur la notion de date SAS et datetime SAS

Date : Une date SAS est un nombre entier égal au nombre de jours écoulés depuis le 1er janvier 1960. Les dates avant 1960 sont donc négatives. Le 1er janvier 1960 est égal à zéro. Ainsi la différence entre deux dates SAS est un nombre de jours.

Time : Un time SAS est un nombre représentant le nombre de secondes écoulées depuis minuit. Il varie entre 0 et 86400 (60 secondes * 60 minutes *24 heures). La différence entre deux times SAS est un nombre de secondes.

Datetime : Un datetime SAS est un nombre représentant le nombre de secondes écoulées depuis le 1er janvier 1960. Ce nombre aura une valeur décimale si on utilise des dixièmes de secondes. Mais ceci est rare. La différence entre deux datetimes SAS est donc un nombre de secondes.

Avantages : Ces nombres facilitent les calculs sur le temps écoulé. De plus, les fonctions de temps SAS ont besoin de ces valeurs. Ainsi la fonction MONTH extrait le mois d’une date SAS (SAS Online Doc. : Liste des fonctions DATE).

Inconvénient et parade : pour lire ces dates/time/datetime, on préfère les voir en langage humain. Soit un format est appliqué sur la valeur numérique, soit une variable caractère est créée avec une fonction PUT et le nom du format. Ce sujet ne sera pas détaillé dans cet article.

SAS Online Doc : About SAS Date, Time and Datetime Values

2. Les fonctions MDY et DHMS

Créer une date avec la fonction MDY : La fonction MDY crée une date SAS. Elle a besoin de trois informations : le mois, le jour et l’année. Aux Etats-Unis, le mois apparaît en premier dans la date, suivi du jour et enfin du mois. Les trois paramètres de cette fonction sont donc des valeurs numériques. Le langage SAS ayant été créé aux États-Unis, l’ordre des paramètres de la fonction MDY est le même. Le nom de la fonction est lui-même parlant : M pour month, D pour day et Y pour year.

visit_dt = mdy(visit_m,visit_d,visit_y);

Créer un time avec la fonction HMS : la fonction HMS retourne un time SAS. Elle est composée de l’heure, des minutes et des secondes.

visit_hour = hms(vist_hr,visit_min,visit_sec);

Créer un datetime avec la fonction DHMS : Créer une datetime avec la fonction DHMS : la fonction DHMS créer une datetime SAS. Elle a 4 paramètres : la date SAS, l’heure, les minutes et les secondes.

visit_time = dhms(visit_dt, vist_hr,visit_min,visit_sec);

3. Lire un texte et le convertir en date/time/datetime

On peut lire une valeur texte et demander à SAS de l’interpréter comme une date. Il faut alors que ce texte suivre une des structures répertoriées par SAS. On parle d’informat. En voici la liste complète : SAS Online Doc., Informats by Category. La fonction INPUT est alors utilisée. Le premier paramètre est soit une valeur texte entre guillemets, soit une variable texte.

DATE informat : Une des notations les plus utilisées pour lire des dates est le jour suivi des trois premières lettres du mois en anglais et enfin de l’année exprimée avec 4 chiffres. La longueur totale étant de 9 caractères, l’informat s’appelle date9. DATE. a pour valeur par défaut 7. Cela impose une année à 2 chiffres.

jour = input(’25NOV1952′,date9.);

nov_dt = input(’25NOV52′,date7.); *attention à l’option globale YEARCUTOFF qui décidera s’il s’agit de 1952 ou 2052 par exemple (voir la note plus bas);

TIME informat : L’informat TIME. a pour longueur par défaut 8. Donc TIME. et TIME8. sont identiques.

heure = input(’08:15:00′,time.);

DATETIME informat : L’informat DATETIME. a pour longueur par défaut 18. Ainsi DATETIME. et DATETIME18. sont identiques.

jour_heure = input(’25NOV1952:08:15:10′,datetime.);

Note sur l’option YEARCUTOFF :

a. Identifier la valeur actuelle de YEARCUTOFF : pour savoir quelle est l’année de YEARCUTOFF, consultez la log après avoir soumis le code suivant :

proc options;
run;

b. Changer le yearcutoff : pour alterner cette valeur, utilisez l’instruction globale OPTIONS et le mot-clé YEARCUTOFF.

options yearcutoff=1950;

c. Interprétation : avec une YEARCUTOFF de 1920,

  • une année inférieure à 20 sera interprétée comme égale à une année 2000 :  20xx.
  • Une année supérieure ou égale à 1920 sera interprétée comme une année 1900 : 19xx

4. Ecrire manuellement quelques valeurs date/time/datetime

Une manière rapide de créer une date SAS si, et seulement si, on a très peu de valeurs à entrer est de faire suivre la valeur texte de d, t ou dt selon qu’il s’agisse d’une date, d’un time ou d’un datetime.

x = ‘ 25NOV1952’d;

x = ’08:15:00’t;

x = ’25NOV1952:08:15:10’dt;

SAS Online Doc. : SAS Constants in Expressions

h1

Et par magie mon jeu de données a disparu (LIBNAME)

mars 6, 2008

Etagères

Une des premières choses à comprendre en SAS est la notion de temporaire et permanent qui s’appliquent aux fichiers. Pour cela, il faut introduire la notion de bibliothèque (library). Ici, je vous propose plus particulièrement de voir les jeux de données SAS, communément appelés data sets.

Un data set c’est quoi ? Un data set SAS est un fichier SAS contenant un tableau. Chaque colonne a un nom et fait référence à une variable, chaque ligne correspond aux observations. Ce type de fichier est créé par SAS via un data set pour une procédure SQL.

Un nom de data set sans extension dans un programme SAS : un jeu de données a un nom pouvant suivant quelques règles de notation :

  • longueur de 32 caractères,
  • nom commençant par une lettre ou un trait bas,
  • caractères suivant pouvant aussi être des chiffres

Une extension (ex. : .sas7bdat) n’est visible que dans une arborescence comme Windows Explorer. Pour le nommer dans un programme, le nom sans l’extension est utilisé. Mais comment SAS sait-il où ce fichier est sauvegarder ?

1. Sauvegarde temporaire 

Un répertoire vidé automatiquement : par défaut, SAS assumera que le data set est sauvegardé dans un répertoire défini lors de l’installation du logiciel. Ce répertoire est vidé à chaque fermeture du logiciel. Dans le cas d’un travail en mode batch (par opposition au mode interactif), ce répertoire est vidé à la fin de chaque soumission de programme.

Pour les curieux : si vous êtes curieux de savoir l’emplacement de votre répertoire temporaire, utilisez la procédure option. La réponse est située dans la fenêtre LOG de SAS. A priori cette information ne vous servira pas pour votre travail de programmation sauf cas exceptionnel (après plusieurs années de SAS, je n’en ai toujours pas eu besoin).

proc options option=work;
run;

WORK ? C’est le petit nom pour parler de ce répertoire au contenu temporaire : l’accès à ce répertoire a un petit nom ! WORK. Le mot WORK est optionnel : ainsi si on veut écrire dans un programme le nom d’un data set dans son intégralité, il suffira d’ajouter WORK avant le nom du jeu de donné et d’utiliser un point comme séparateur. Comme WORK est la valeur par défaut, un data set nommé DEMO et sauvegardé sous WORK sera référencé indifféremment DEMO ou WORK.DEMO. Lors de la fermeture du logiciel SAS, le fichier DEMO sera supprimé. C’est pour cela que l’on parle de fichier temporaire. Du coup, comment créer un data set qui puisse survivre à une session SAS ?

2. Des data sets qui survivent

Une ‘library’ fait référence à un espace de stockage : le répertoire temporaire, WORK, fait partie de la catégorie des bibliothèques. Et en anglais bibliothèque se traduit… ? library. Pour faire référence à un autre répertoire, qui lui ne sera pas vidé automatique par SAS, il faut de définir dans une instruction LIBNAME (LIB comme notre LIBRARY de tout à l’heure et NAME, donc nom de bibliothèque). Une convention similaire au nom de data set à part la longueur. Comme pour WORK, il faut donner un petit nom au chemin d’accès à ce répertoire. On parle de LIBREF.

  • 8 caractères sont autorisés au maximum.
  • Comme un nom de data set, il commencera par une lettre ou un trait bas.
  • Pour les autres caractères les chiffres sont aussi valides.

Trois composants principaux pour l’instruction LIBNAME : l’instruction LIBNAME est composée du mot-clé LIBNAME, du petit nom et du chemin d’accès entre guillemets.


libname origin ‘C:\sasref\origine’;
libname propre ‘C:\sasref\propre’;

Désactiver une bibliothèque : par défaut, la bibliothèque sera valide jusqu’à la fin de la session en mode interactif. Pour désactiver la bibliothèque plus tôt, il suffit de la nommer sans préciser le chemin d’accès et en ajoutant clear. Si on veut les désassigner toutes, le nom de la bibliothèque sera remplacée par le mot-clé _all_ (SAS Online Doc: The Libname Statement Syntax for Relational Databases).


libname origin clear;
libname propre clear;
libname _all_ clear;

Consulter la vue SASHELP.VSLIB pour connaître les bibliothèques actives : les vues sont des fichiers contenant un code. Lors de la lecture de ce fichier, le code est soumis. Cela permet de retrouver en temps réel l’information, la dernière. On trouve notamment la vue VSLIB sauvegardés dans le répertoire permanent de SASHELP. Grâce à cette vue vous découvrirez également les autres bibliothèques créées lors de l’installation de SAS (MAP, SASHELP,SASUSER) qui ne sont pas vidées en fin de session et dans lesquelles on ne modifie rien, on lit seulement.

proc sql;
   select *
   from sashelp.vslib;
quit;

L’instruction LIBNAME a plusieurs options. Mais étant utilisés de manières sporadique pour des cas bien particulier, cela ne relève pas d’un article pour débutant en SAS.