SAS Base  •  Module VI  •  1 h
Les PROC utilitaires
M2 TIDE — Stage de programmation SAS — Enseignement 100 % distanciel
Objectifs du module
  • Comprendre la logique de l'étape PROC et sa différence avec l'étape DATA
  • Décrire une table avec CONTENTS, la trier et dédoublonner avec SORT
  • Produire des listings soignés avec PRINT
  • Importer et exporter des fichiers, et créer ses propres formats avec FORMAT

1. Généralités sur l'étape PROC

L'objectif des procédures est d'effectuer des actions spécifiques sur les données : agrégations, tri, statistiques, listings, graphiques. Là où les étapes DATA travaillent ligne par ligne, les procédures travaillent sur un ensemble de lignes.

proc NOM_PROCEDURE <options> ;
    <parametres, variables, mots-cles> ;
run ;

Ce module présente cinq procédures essentielles : CONTENTS, SORT, PRINT, IMPORT/EXPORT et FORMAT.

2. PROC CONTENTS

La PROC CONTENTS produit la description de toutes les variables d'une table, mais aussi la date de création, la version de SAS ayant créé la table, la présence d'un tri préalable, le nombre d'observations et de variables. Sa syntaxe est minimale et la richesse de son information l'a rendue très populaire.

proc contents data = TABLE
    <out = table_decrivant_les_variables>
    <noprint> ;
run ;

L'option NOPRINT annule la production de toute sortie texte ; elle s'accompagne souvent de OUT= qui récupère les informations sur les variables dans une table SAS — pratique pour construire des traitements génériques.

3. PROC SORT

La procédure SORT trie une table selon une ou plusieurs variables, en ordre ascendant ou descendant, et permet également l'élimination de doublons.

proc sort data = TABLE
    <out = TABLE_TRIEE>
    <nodup | nodupkey | dupout = TABLE_DOUBLONS> ;
    by <descending> liste_de_variables ;
run ;
Élément Effet
by Variables de tri, séparées par un blanc. Ordre croissant par défaut ; faire précéder de DESCENDING pour l'inverse — seule la variable qui suit ce mot est concernée
out = Nom de la table en sortie
nodup Supprime les enregistrements en double sur toutes les variables de la table
nodupkey Supprime les doublons sur les variables de tri uniquement
dupout = Table dans laquelle les doublons seront stockés
Si la table en sortie n'est pas précisée, la table en entrée est écrasée : elle est réécrite et triée sur elle-même. Sur une table source que vous ne pouvez pas régénérer, c'est irréversible. Prenez l'habitude systématique de renseigner OUT=.

Deux remarques sur le tri : les données manquantes — le point pour le numérique, le blanc pour le caractère — se placent toujours au début en tri croissant ; et, sauf cas particulier lié au système d'exploitation, c'est le premier enregistrement distinct rencontré qui est conservé par NODUPKEY.

4. PROC PRINT

La procédure PRINT édite un listing des données d'une table. Les informations peuvent être sélectionnées et une mise en forme simple réalisée. Les listings peuvent être redirigés vers la fenêtre OUTPUT ou vers un fichier externe (htm, rtf, pdf) grâce à l'ODS.

proc print data = TABLE <options> ;
    <instructions> ;
run ;

Les options principales :

Option Effet
LABEL Affiche les libellés des variables au lieu de leurs noms
NOOBS N'affiche pas les numéros d'observation
SPLIT = '*' L'astérisque dans un libellé ne s'affiche pas et provoque un retour à la ligne
N Affiche le nombre d'observations en fin de listing ; on peut y ajouter un intitulé
DOUBLE Une ligne blanche entre chaque ligne imprimée
UNIFORM Uniformise le nombre de variables sur les pages
ROUND Arrondit à 2 décimales les variables sommées

Les instructions principales :

Instruction Effet
var Liste des variables à éditer, dans l'ordre cité. Sans elle, toutes les variables sont imprimées dans leur ordre de création
id Variables présentées sur chaque page, remplaçant le numéro d'observation
sum Variables pour lesquelles un total colonne sera calculé
by Variables de rupture. La table doit être triée au préalable sur ces mêmes variables
sumby Seule variable de rupture provoquant un sous-total
pageby Variable de rupture provoquant un saut de page à chaque changement de valeur
proc sort data = MALIB.PRDSALE out = work.ventes ;
    by YEAR COUNTRY ;
run ;

proc print data = work.ventes noobs label ;
    by YEAR COUNTRY ;
    var PRODTYPE PRODUCT ACTUAL PREDICT ;
    sum ACTUAL ;
    sumby YEAR ;
    label ACTUAL = "Ventes reelles"  PREDICT = "Ventes prevues" ;
    where ACTUAL between 500 and 520 ;
run ;

5. PROC EXPORT et PROC IMPORT

La procédure EXPORT écrit des données dans un fichier externe à partir d'une table SAS.

proc export data = TABLE
    outfile = "chemin/fichier"
    <dbms = identifier> <replace>
    <sheet = nom_feuille> ;
    <delimiter = ";"> ;
run ;

L'option DELIMITER permet de choisir son séparateur lors d'un export non spécifié dans le tableau des DBMS ; elle doit être utilisée avec dbms = DLM.

Sans le module SAS/ACCESS to PC Files, on ne peut importer ou exporter que les fichiers de type DLM, CSV ou TAB. C'est une limite fréquemment rencontrée en environnement universitaire.

La procédure IMPORT fait l'opération inverse :

proc import datafile = "chemin/fichier"
    out = TABLE_DE_SORTIE
    <dbms = identifier>
    <replace>
    <sheet = nom_feuille> ;
run ;

6. PROC FORMAT : créer ses propres formats

Un format associe des libellés aux valeurs des variables d'une table. Mais au-delà du simple affichage, les formats permettent de faire facilement des calculs par tranche, sans créer de variable ni faire de jointure. C'est leur usage le plus puissant.

Le résultat de la procédure FORMAT est un catalogue SAS nommé par défaut FORMATS, placé dans WORK si sa localisation n'est pas précisée.

proc format lib = LIBRAIRIE_SAS ;

    value $ NOM_FORMAT_CARACTERE
        "CODE1", "CODE2" = "Intitule du code 1"
        "CODE3"          = "Intitule du code 2"
        other            = "Autres" ;

    value NOM_FORMAT_NUMERIQUE
        low - 11        = "Moins de 12 ans"
        12 - 13         = "12-13 ans"
        14 - 15         = "14-15 ans"
        15 <- high      = "Plus de 15 ans" ;

run ;
Élément Règle
Nom du format 8 caractères maximum, sans caractère spécial hormis le tiret bas, ne peut pas se terminer par un chiffre
$ devant le nom Indique un format caractère ; sans lui, format numérique
other = Intitulé général pour toutes les valeurs non citées
BORNE_INF - BORNE_SUP Intervalle dont les bornes sont incluses
BORNE_INF - < BORNE_SUP Le signe < exclut la borne qu'il précède

Le format est ensuite appliqué à l'affichage par une instruction FORMAT, ou utilisé pour recoder via la fonction PUT :

proc print data = work.class ;
    format AGE age_recod.  SEX $sex_recod. ;
run ;

data work.class2 ;
    set work.class ;
    TRANCHE_AGE = put(AGE, age_recod.) ;
run ;

7. Exercices d'application

Exercice VI.1 — Afficher la description de la table SASHELP.PRDSALE avec la PROC CONTENTS.
Voir le corrigé
proc contents data = sashelp.prdsale ; run ;
Exercice VI.2 — Trier SASHELP.CLASS par AGE et NAME et stocker le résultat dans une table temporaire ; puis trier en ordre décroissant ; puis ne conserver qu'un enregistrement par âge distinct.
Voir le corrigé
proc sort data=sashelp.class out=work.tri1 ;
    by age name ;
run ;

proc sort data=sashelp.class out=work.tri2 ;
    by descending age descending name ;
run ;

proc sort data=sashelp.class out=work.tri3 nodupkey ;
    by age ;
run ;
Exercice VI.3 — Créer un listing des variables PRODTYPE PRODUCT ACTUAL PREDICT de MALIB.PRDSALE ; puis le même listing avec des ruptures par année et par pays, sans numéro d'observation. Si vous avez le temps : donner un libellé aux variables, ajouter le sous-total puis le total général des ventes par année, et filtrer les ventes comprises entre 500 et 520 dollars.
Voir le corrigé
proc print data=malib.prdsale ;
    var prodtype product actual predict ;
run ;

proc sort data=malib.prdsale out=work.ventes ;
    by year country ;
run ;

proc print data=work.ventes noobs ;
    by year country ;
    var prodtype product actual predict ;
run ;

/* Version complete : libelles, sous-totaux, total general, filtre */
proc print data=work.ventes noobs label ;
    by year country ;
    var prodtype product actual predict ;
    sum actual ;
    sumby year ;
    label actual="Ventes reelles"  predict="Ventes prevues" ;
    where actual between 500 and 520 ;
run ;
Exercice VI.4 — À partir de SASHELP.PRDSALE, créer un fichier texte avec séparateur tabulation. À partir de SASHELP.CLASS, créer un fichier csv avec séparateur virgule, puis un autre avec séparateur point-virgule.
Voir le corrigé
proc export data=sashelp.prdsale
    outfile="/chemin/prdsale.txt"
    dbms=tab replace ;
run ;

proc export data=sashelp.class
    outfile="/chemin/class.csv"
    dbms=csv replace ;
run ;

proc export data=sashelp.class
    outfile="/chemin/class_pv.csv"
    dbms=dlm replace ;
    delimiter=";" ;
run ;
Exercice VI.5 — Créer des tables SAS temporaires à partir des fichiers texte et csv créés précédemment.
Voir le corrigé
proc import datafile="/chemin/prdsale.txt"
    out=work.prdsale_import
    dbms=tab replace ;
run ;

proc import datafile="/chemin/class.csv"
    out=work.class_import
    dbms=csv replace ;
run ;
Exercice VI.6 — Créer la table TAILLE contenant les valeurs 1 2 2 2 1 2 1 2 1 2 1 2 lues avec le pointeur @@. Créer le format TAILLE_REF associant 1 à GRAND et 2 à petit, puis afficher la table avec ce format.
Voir le corrigé
data work.taille ;
    input taille @@ ;
    cards ;
1 2 2 2 1 2 1 2 1 2 1 2
;
run ;

proc format ;
    value taille_ref 1="GRAND"  2="petit" ;
run ;

proc print data=work.taille ;
    format taille taille_ref. ;
run ;
Exercice VI.7 — Créer les formats AGE_RECOD (moins de 12 ans, 12-13 ans, 14-15 ans, plus de 15 ans) et SEX_RECOD (Homme, Femme). Recopier SASHELP.CLASS dans WORK puis créer deux nouvelles variables à partir de AGE et SEX en utilisant ces formats.
Voir le corrigé
proc format ;
    value age_recod  low-11="Moins de 12 ans"  12-13="12-13 ans"
                     14-15="14-15 ans"  15<-high="Plus de 15 ans" ;
    value $sex_recod "M"="Homme"  "F"="Femme" ;
run ;

data work.class ;
    set sashelp.class ;
    tranche_age  = put(age, age_recod.) ;
    sexe_lettres = put(sex, $sex_recod.) ;
run ;
Point de contrôle — à faire avant de continuer
Après l'exercice VI.7, essayez de calculer une moyenne par tranche d'âge sans jamais créer de variable de tranche, en passant uniquement par un format et une instruction CLASS. Si vous y parvenez, vous avez compris l'intérêt réel de la PROC FORMAT.
Pour valider ce module
  • QCM — QCM Module VI — 5 questions, auto-évaluation
Last modified: Tuesday, 11 August 2026, 2:15 PM
Accessibility

Background Colour Background Colour

Font Face Font Face

Font Kerning Font Kerning

Image Visibility Image Visibility

Line Height Line Height

1.2

Link Highlight Link Highlight

Text Alignment Text Alignment

Font Size Font Size

1

Letter Spacing Letter Spacing

0

Text Colour Text Colour

Paragraph Width Paragraph Width

0