logo

Les picture expliqués à ma fille

Déjà qu’ils sont nombreux, ceux qui pestent contre les formats ! Mais s’ils connaissaient tous l’abominable syntaxe des picture, ces formats « calculés », quel serait leur nombre ? En même temps, ce serait l’occasion de trouver mille manipulations bien pratiques pour formater élégamment et en évitant d’inutiles étapes DATA.

Un picture est un format particulier destiné à des variables de type numérique ; il peut s’appliquer à des nombres, des dates, des heures ou des datetimes. Il n’existe pas d’équivalent pour les variables de type caractère – en attendant les formats à fonctions de SAS 9.3.

Un picture sur des nombres

Dans ce premier cas, on propose des couples de valeurs stockées et affichées comme dans un format classique, mais la valeur affichée comporte des chiffres dont le rôle est particulier (ils ne sont pas à afficher au pied de la lettre) : le 0 pour un chiffre significatif, le 9 pour un chiffre à afficher quoi qu’il arrive.

Ainsi, un nombre comme 12 sera affiché « 0012 » via le masque « 9999 », mais « 12 » via le masque « 0009 ».

Deux options permettent également d’attribuer un sens à d’autres caractères proposés dans le masque d’affichage : DECSEP indique quel caractère sert de séparateur décimal et DIG3SEP de séparateur de milliers.

L’option PREFIX permet d’indiquer un texte précédent la valeur affichée (le masque ne pouvant commencer que par 0 ou 9, tout autre caractère étant ignoré) ; cela s’avère notamment utile pour les valeurs négatives : le signe moins est à indiquer dans PREFIX.

PROC FORMAT < LIB = bibliothèqueDeSauvegarde > ;
  PICTURE nomFormat
     plageValeurs = "valeur affichée" < ( < DECSEP  = "?" >  < DIG3SEP = "?" >  < PREFIX  = "?" > ) > 
  ;
RUN ;

Les plages de valeurs sont à indiquer comme dans un format normal : les mots-clés HIGH, LOW et OTHER sont autorisés, ainsi que les < de part et d’autre du tiret (-) pour indiquer une exclusion d’une borne de l’intervalle considéré.

Le nom du format suit les mêmes normes qu’un format numérique SAS :

  • contient uniquement des chiffres, des lettres non accentuées et des underscores (_) ;
  • commence par un underscore ou une lettre ;
  • ne se termine pas par un chiffre ;
  • fait au plus 8 caractères en version 8, 32 en version 9.
PROC FORMAT ;
  PICTURE milliers
    LOW -< 0 = "000 000 009,99" (DECSEP  = ","  DIG3SEP = " " PREFIX  = "- ")
    0 - HIGH = "000 000 009,99" (DECSEP  = "," DIG3SEP = " ")
  ;
  PICTURE signes
    LOW -< 0 = "000 000 009,99" (DECSEP  = ","  DIG3SEP = " " PREFIX  = "- ")
    0 - HIGH = "000 000 009,99" (DECSEP  = "," DIG3SEP = " "  PREFIX  = "+ ")
  ;
RUN ;
PROC SQL ;
  SELECT country,
         SUM(actual)  AS reel FORMAT=milliers.,
         SUM(predict) AS prev FORMAT=milliers.,
         CALCULATED reel-CALCULATED prev AS ecart FORMAT=signes.
  FROM sashelp.prdsale
  GROUP BY country ;
QUIT ;
Country reel prev ecart
CANADA 246 990,00 233 019,00 + 13 971,00
GERMANY 245 998,00 231 554,00 + 14 444,00
U.S.A. 237 349,00 241 722,00 – 4 373,00

On peut également manipuler au préalable la valeur à formater : par exemple pour afficher les montants en kilo-euros. Pour cela, on doit indiquer d’une part le multiplicateur à appliquer au nombre tel qu’il est stocké par SAS, et d’autre part l’option ROUND afin que le résultat soit arrondi et pas tronqué à l’affichage.

PROC FORMAT ;
  PICTURE keuros (ROUND)
    0-HIGH = "000 009,99 k€" ( DECSEP = "," DIG3SEP = " " MULT = 0.001)
  ;
RUN ;
PROC SQL ;
  SELECT country,
         SUM(actual)  AS reel FORMAT=keuros.,
         SUM(predict) AS prev FORMAT=keuros.
  FROM sashelp.prdsale
  GROUP BY country ;
QUIT ;
Country reel prev
CANADA 2,47 k€ 2,33 k€
GERMANY 2,46 k€ 2,32 k€
U.S.A. 2,37 k€ 2,42 k€

Un picture sur des dates

Pour les dates, l’écriture d’un picture est plus riche, donc plus complexe. Elle nécessite d’abord d’indiquer le type de données formatées (DATE, DATETIME, TIME) dans une option DATATYPE située chaque série de valeurs affichées. Il est conseillé d’indiquer la longueur de la plus longue valeur affichée dans une option DEFAULT située, elle, après le nom du format.

PROC FORMAT < LIB = bibliothèqueDeSauvegarde > ;
  PICTURE nomFormat (DEFAULT = longueurParDéfaut)
    plageValeurs = "valeur affichée"  (DATATYPE = DATE|TIME|DATETIME)
  ;
RUN ;

Les valeurs affichées peuvent comprendre les expressions suivantes…

Pour une date ou un datetime :

  • %a = nom du jour de la semaine en abrégé ;
  • %A = nom du jour de la semaine en intégralité ;
  • %b = nom du mois en abrégé ;
  • %B = nom du mois en intégralité ;
  • %d = jour du mois (de 1 à 31) sans zéro préalable ;
  • %0d = jour du mois sur deux chiffres (y compris zéro préalable) ;
  • %j = jour dans l’année (de 1 à 366) sans zéro préalable ;
  • %0j = jour dans l’année sur 3 chiffres (y compris zéro préalable) ;
  • %m = numéro du mois (de 1 à 12) sans zéro préalable ;
  • %0m = numéro du mois sur 2 chiffres (y compris zéro préalable) ;
  • %U = numéro de semaine (de 0 à 53) avec le dimanche comme 1er jour de la semaine ;
  • %w = numéro du jour de la semaine (de 1=dimanche à 7=samedi) ;
  • %y = année sur 1 ou 2 chiffres (de 0 à 99) ;
  • %0y = année sur 2 chiffres (de 00 à 99) ;
  • %Y = année sur 4 chiffres.

Pour un temps ou un datetime :

  • %H = heure (de 0 à 23) sans zéro préalable ;
  • %0H = heure (de 00 à 23) ;
  • %I et %0I = heure par cycles de 12 heures (de 0 ou 00 à 12) ;
  • %M et %0M = minutes ;
  • %p = matin ou après-midi ;
  • %S et %0S = secondes.

Les noms (de mois, de jour) sont en français si la session SAS est en français (option LOCALE=FRENCH) et sinon en anglais.

PROC FORMAT ;
  PICTURE mois (DEFAULT = 40)
    LOW-HIGH = "Mois de %B %Y" (DATATYPE=DATE)
  ;
RUN ;
PROC FREQ DATA = sashelp.prdsale ;
  WHERE month <= "01mar2003"d ;
  TABLE month / NOCUM ;
  FORMAT month mois. ;
RUN ;
Month
MONTH Fréquence Pourcentage
Mois de janvier 1993 60 4.17
Mois de février 1993 60 4.17
Mois de mars 1993 60 4.17
19 found this helpful