📖 Cours Module II — Variables, formats et informats
- Énumérer les attributs obligatoires et facultatifs d'une variable SAS
- Distinguer un format (masque d'affichage) d'un informat (masque de lecture)
- Lire et écrire les formats numériques et caractères standards
- Manipuler les dates SAS et leurs formats spécifiques
1. Définition d'une variable
Une variable SAS est obligatoirement définie par trois attributs :
| Attribut | Précisions |
|---|---|
| Un nom SAS | 32 caractères au maximum |
| Un type | Caractère ou numérique — il n'y en a que deux |
| Une longueur de stockage | Numérique : de 3 à 8 octets. Caractère : de 1 à 32 767 octets |
Elle possède également des caractéristiques optionnelles.
Un format définit le masque d'affichage des données.
Un informat définit le masque de saisie ou de lecture des données.
Un label est un intitulé long associé à la variable, 256 caractères maximum.
Trois propriétés à mémoriser :
| Propriété | Conséquence |
|---|---|
| Une variable numérique est toujours stockée sur 8 octets | Quelle que soit la valeur : 1 ou 3,14159 occupent la même place |
| Une date SAS est une variable numérique | Elle vaut le nombre de jours écoulés depuis le 1er janvier 1960 |
| Une variable caractère peut contenir lettres, chiffres et caractères spéciaux | Longueur maximale 32 767 octets |
2. Les formats
Un format est une instruction que le système SAS utilise pour écrire la valeur des données. Appliquer un format ne modifie jamais la valeur stockée dans la table : c'est un masque, pas une transformation.
La notation générale utilise deux paramètres.
La lettre w désigne un entier positif qui représente toujours le nombre total de caractères de la donnée formatée.
La lettre d désigne le nombre de décimales.
| Type | Notation | Exemple | Rendu |
|---|---|---|---|
| Chaîne de caractères | $w. avec w de 1 à 200 | $7. | abcdefg — aligné à gauche en lecture |
| Numérique | w.d avec w de 1 à 32 et d de 1 à 31 | 8.2 | 12345.67 |
| Nombre à virgule | COMMAw.d | COMMA9.2 | 12,234.21 |
| Montant en dollars | DOLLARw.d | DOLLAR10.2 | $12,234.21 |
3. Le cas particulier des formats de date
Les valeurs de date sont stockées comme des variables numériques spéciales.
La valeur d'une date SAS est le nombre de jours entre le 1er janvier 1960 et la date indiquée.
De la même manière, une valeur datetime est le nombre de secondes écoulées depuis le 1er janvier 1960.
Pour faciliter la lecture, il est vivement conseillé d'appliquer des formats de date prédéfinis :
| Format | Description | Exemple |
|---|---|---|
| DATEw. | Jour, mois (3 premières lettres en anglais), année. En écriture w de 5 à 9 : si w < 7 l'année ne figure pas, si w ≥ 9 le siècle figure | 1er avril 1990 en DATE7. donne 01APR90 |
| DDMMYYw. | Identique, mois en deux chiffres | 14 juillet 2012 en DDMMYY5. donne 14/07/12 |
| YYMMDDw. | Positions du jour et de l'année échangées | 14 juillet 2012 en YYMMDD8. donne 12-07-14 |
| MONYYw. | Format DATEw. restreint au mois et à l'année | JUL2012 |
| YYQxw. | Année et trimestre, x étant la première lettre du séparateur (Colon, Dash, Period, Slash) | 3e trimestre 2001 en YYQC4. donne 01:3 |
4. Les informats
Un informat permet de lire des données brutes et de les stocker dans des tables SAS.
Là où le format répond à la question « comment afficher cette valeur ? », l'informat répond à « comment interpréter les caractères que je suis en train de lire ? ».
Un informat définit la largeur du champ d'entrée et la façon de lire les valeurs de données emmagasinées dans ce champ. Nous les manipulerons concrètement au module III avec l'instruction INPUT, dans une étape DATA qui lit un fichier externe.
La notation générale ressemble à celle des formats, avec les mêmes lettres w et d :
| Type | Notation | Exemple | Effet en lecture |
|---|---|---|---|
| Chaîne de caractères | $w. avec w de 1 à 200 | $15. | Lit les 15 premiers caractères du champ comme du texte |
| Numérique standard | w.d avec w de 1 à 32 et d de 0 à 31 | 8.2 | Lit 8 caractères et place le point décimal 2 positions avant la fin s'il n'est pas déjà présent dans le texte lu |
| Date au format jour/mois/année | DDMMYYw. | DDMMYY10. | Lit une date écrite 14/07/2012 et la stocke comme le nombre de jours depuis 1960 |
| Date au format année-mois-jour | YYMMDDw. | YYMMDD10. | Lit une date écrite 2012-07-14 |
| Nombre avec séparateurs de milliers | COMMAw.d | COMMA9.2 | Lit un nombre écrit avec des virgules ou espaces de séparation, comme 12,234.21 |
Un informat de date ne produit pas un texte affichable : il produit la valeur numérique interne (le nombre de jours depuis 1960). C'est ensuite un format, appliqué séparément, qui permettra de l'afficher lisiblement.
/* Lecture d'une date ecrite 14/07/2012 dans un fichier texte */ informat date_vente DDMMYY10. ; format date_vente DATE9. ;
Dans cet exemple, l'informat sert à interpréter la chaîne lue et le format à réafficher la même valeur sous une autre forme (14JUL2012).
data _null_ ;
date_sas = input("14/07/2012", ddmmyy10.) ;
put date_sas date9. ;
run ;
/* La LOG affiche : 14JUL2012 */
5. Récapitulatif : format ou informat ?
Les deux notions se ressemblent et se confondent facilement en début d'apprentissage. Le tableau suivant résume la distinction à retenir avant de passer au module III.
| Â | Format | Informat |
|---|---|---|
| Rôle | Écrire / afficher une valeur déjà stockée | Lire une donnée brute et la stocker |
| Répond à la question | Comment afficher cette valeur ? | Comment interpréter ce que je lis ? |
| S'utilise avec | PUT, ou en propriété d'affichage d'une variable | INPUT, ou en propriété de lecture d'une variable |
| Modifie-t-il la valeur stockée ? | Non, jamais | Oui : il détermine la valeur stockée au moment de la lecture |
6. Exercices d'application
Voir le corrigé
proc contents data = sashelp.retail ; run ;
Dans la sortie, la colonne Format liste, pour chaque variable, le format qui lui est appliqué (par exemple DATE9. pour une variable de date).
Voir le corrigé
data _null_ ;
d = mdy(2, 14, 1984) ;
put d= ;
run ;
La LOG affiche d=8810 : le 14 février 1984 correspond à 8810 jours après le 1er janvier 1960.
Voir le corrigé
data _null_ ;
d = mdy(7, 14, 2012) ;
put d date7. ;
put d date9. ;
put d ddmmyy10. ;
put d monyy7. ;
run ;
La LOG affiche successivement 14JUL12, 14JUL2012, 14/07/2012 puis JUL2012 : c'est exactement la même valeur numérique stockée (19188), seul l'affichage change d'un PUT à l'autre.
Voir le corrigé
data _null_ ;
x = 1234567.891 ;
put x 8.2 ;
put x comma12.2 ;
put x dollar14.2 ;
put x 6.2 ;
run ;
Avec 8.2, la valeur s'affiche tronquée : 8 caractères ne suffisent pas pour écrire 1234567.89 (10 caractères, point compris). Avec 6.2 la troncature est encore plus sévère. C'est l'illustration directe de la remarque de la section 2 : SAS n'émet aucune erreur dans la LOG, il affiche simplement ce qu'il peut dans la largeur impartie.
Voir le corrigé
data _null_ ;
date_sas = input("14/07/2012", ddmmyy10.) ;
put date_sas date9. ;
run ;
La LOG affiche 14JUL2012. L'informat DDMMYY10. a servi à interpréter la chaîne lue par INPUT ; le format DATE9. a ensuite servi à afficher cette même valeur numérique sous une forme lisible. C'est la même mécanique que vous emploierez au module III, mais appliquée cette fois à un fichier entier plutôt qu'à une seule chaîne.
- QCM — QCM Module II — 5 questions, auto-évaluation
Couleur de fond
Police
Crénage de la police
Visibilité de l’image
Hauteur de ligne
Surbrillance de lien
Alignement du texte
Taille de police
Espacement des lettres
Couleur de texte
Largeur de paragraphe