Formats personnalisés complexes : Faites chanter les chiffres avec PROC FORMAT PICTURE

Cet article en deux mots :

Marre des suites de chiffres illisibles ? Découvrez comment l'instruction PICTURE de la PROC FORMAT transforme vos données brutes en rapports ultra-précis sans modifier vos tables. Entre astuces de masquage (0 vs 9), multiplicateurs et préfixes dynamiques, devenez un expert du formatage avancé et validez sereinement votre certification SAS 9 Advanced grâce à nos exemples concrets tirés de l'univers Skynet.

Skynet a un souci d'interface. Ses capteurs temporels renvoient des coordonnées de saut brutes sous la forme 202905121430 (pour le 12 Mai 2029 à 14h30). Ses numéros de série de Terminators sortent sous la forme 800101555. Pour un microprocesseur, c'est très clair. Mais lorsque Skynet doit générer un rapport de production pour ses propres archives, ces suites de chiffres donnent vite la migraine (ou l'équivalent cybernétique).

Jusqu'ici, vous connaissiez probablement la PROC FORMAT classique avec l'instruction VALUE. C'est parfait pour traduire des codes simples (ex: 1 = 'Actif', 2 = 'Détruit').

Mais pour la certification SAS 9 Advanced, vous devez maîtriser le niveau supérieur : l'instruction PICTURE. Elle permet de créer des masques (ou templates) visuels ultra-personnalisés pour vos nombres, sans avoir à les transformer en texte dans une étape DATA.

1. VALUE vs PICTURE : Le choc des formatsInstructions de présentation appliquées aux valeurs des variables pour modifier leur apparence (dates, monnaies, libellés) sans altérer la donnée stockée dans les tables SAS Viya.

  • VALUE prend une donnée et la remplace par un texte (ex: 800 devient "ModèleReprésentation mathématique entraînée sur des données pour capturer des tendances, prédire des résultats ou classifier des observations via des algorithmes (Régression, Forêt aléatoire, Gradient Boosting). T-800").
  • PICTURE prend un nombre et le moule dans une structure visuelle tout en conservant les chiffres d'origine (ex: 800001 devient "T-800.001").

Créons notre format d'affichage pour les numéros de série des cyborgs :

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
proc format;
/* On crée un format numérique nommé "serie" */
picture serie
/* De 0 à 999 999 999, on applique ce masque */
0 - 999999999 = 'T-000.000.000';
run;

/* Testons-le ! */
data _null_;
Matricule_1 = 800101555;
Matricule_2 = 600000001;

put Matricule_1 serie.;
put Matricule_2 serie.;
run;

Résultat dans la log : T-800.101.555 T-600.000.001

Magique, non ? Sans aucune fonction SUBSTR ou de concaténation complexe, Skynet a formaté ses matricules à la volée !

2. Le piège de l'examen : Le 0 vs Le 9

C'est LA question inévitable de l'examen sur la PROC FORMAT PICTURE. Dans votre masque, que vous utilisiez un 0 ou un 9, SAS sait qu'il doit y mettre un chiffre. Mais il y a une différence majeure dans la gestion des zéros non significatifs (les zéros au début du nombre).

  • Le 0 (Zéro) : Supprime les zéros non significatifs. S'il n'y a pas de chiffre à placer, il laisse un espace vide.
  • Le 9 (Neuf) : Force l'affichage des zéros non significatifs.

Imaginons que Skynet veuille formater les numéros de téléphone cibles interceptés (ex: 5550199) avec le format américain (xxx) xxx-xxxx.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
proc format;
picture tel_zero
low-high = '(000) 000-0000'; /* Avec des 0 */

picture tel_neuf
low-high = '(999) 999-9999'; /* Avec des 9 */
run;

data _null_;
Numero = 5550199; /* Il manque l'indicatif régional au début ! */

put Numero tel_zero.;
put Numero tel_neuf.;
run;

Résultat dans la log : Avec les zéros : ( ) 555-0199 (Les 0 ont disparu, laissant un trou moche) Avec les neufs : (000) 555-0199 (Les 9 ont forcé l'affichage des zéros, la structure est intacte !)

Règle d'or : Si vous voulez que votre nombre fasse toujours la même taille à l'écran, même s'il est petit, utilisez des 9.

3. Les multiplicateurs (MULT=) pour simuler des décimales

Skynet calcule des probabilités de victoire. La valeur dans la table est 99 (pour 99%). Mais Skynet veut l'afficher 99.00%.

Si vous faites le masque 00.00%, SAS va placer le 99 à la fin et affichera 00.99%. C'est la panique. Pourquoi ? Parce que SAS aligne toujours les nombres entiers sur la droite du masque !

Pour forcer SAS à décaler le nombre vers la gauche et lui rajouter de faux zéros après la virgule, on utilise l'option MULTIPLIER= (ou MULT=).

1
2
3
4
5
6
7
8
9
proc format;
picture proba
low-high = '09.99 %' (mult=100);
run;

data _null_;
Victoire = 99;
put Victoire proba.; /* Affiche : 99.00 % */
run;

En multipliant par 100 en arrière-plan, 99 devient temporairement 9900, ce qui s'insère parfaitement dans notre masque 09.99 pour donner 99.00. L'examen adore tester votre compréhension de cette astuce.

4. L'option PREFIX= pour du texte dynamique

Parfois, les caractères spéciaux inclus dans votre masque prennent trop de place. Si vous utilisez des zéros (0) et que le nombre est petit, vous risquez d'avoir de gros espaces vides avant votre préfixe.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
proc format;
/* Mauvaise méthode */
picture budget_mal_fait
low-high = 'Budget: $000,000,000';

/* Bonne méthode : PREFIX= */
picture budget_pro
low-high = '000,000,000' (prefix='Budget: $');
run;

data _null_;
Cout = 50000;
put Cout budget_mal_fait.; /* Affiche : "Budget: $ 50,000" */
put Cout budget_pro.; /* Affiche : "Budget: $50,000" (collé au chiffre !) */
run;

L'option PREFIX= garantit que votre texte vient se coller exactement juste avant le premier chiffre significatif, peu importe la taille du nombre. C'est idéal pour les devises (Euros, Dollars... ou crédits intergalactiques).

Conclusion

La PROC FORMAT PICTURE est souvent sous-estimée, mais c'est un outil incroyablement puissant pour générer des tableaux de bord et des rapports sans altérer vos données brutes. Et surtout, c'est une mine d'or pour les concepteurs de l'examen SAS 9 Advanced (retenez bien la différence 0 vs 9 et l'option MULT=).

Dans l'Article 16, nous allons changer de registre. Skynet devient paranoïaque. La résistance tente de pirater ses tables. Nous allons voir comment modifier des données sans créer de nouvelles tables (avec l'instruction MODIFY), et comment activer les Pistes d'Audit (Audit Trails) pour surveiller qui modifie quoi, à quelle heure. Big Brother mode activé.

Nicolas Housset

Passionné d'informatique, je suis Consultant et expert technique SAS VIYA, également co-fondateur de la société Flexcelite. Spécialisé dans les technologies SAS (Viya, 9.4) et les infrastructures associées (Linux, Hadoop, Azure), ce blog est mon espace pour partager mes mémos techniques et retours d'expérience.