FAQ SASConsultez toutes les FAQ

Nombre d'auteurs : 13, nombre de questions : 308, dernière mise à jour : 5 avril 2016  Ajouter une question

 

Cette F.A.Q., qui traite de tout type de questions portant sur l'outil SAS, a été réalisée à partir des contributions des membres des forums sas de developpez.com en vue de répondre à des questions fréquemment posées par les utilisateurs et grâce à SAS France qui a bien voulu nous donner accès à ses sources.

Si vous désirez contribuer à l'amélioration de cette F.A.Q., vous pouvez participer au billet de participation à l'enrichissement de la faq SAS , ou contacter le responsable SAS , ou contacter un des responsables de l'équipe Business Intelligence .

Nous espérons que cette F.A.Q. saura répondre à un maximum de vos questions. Nous vous souhaitons une bonne lecture.

L'équipe SAS de developpez.com remercie les contributeurs actuels : ash_rmy , bahraoui , datametric , fafabzh6 , Fleur-Anne.Blain , green_fr , oncle_pete , raf64flo , rastoix , s_a_m et steelspirit .

L'équipe SAS de developpez.com remercie aussi claudeLeloup et jacques_jean pour leurs relectures attentives de la F.A.Q. dans le but de chasser les fautes d'orthographes.


SommaireProgrammation sur SAS BASEManipulations sur une base de données (26)
précédent sommaire suivant
 

Supposons que nous ayons un fichier coatch.txt qui contient des équipes décrites par leur nom, année de création et nombre de joueurs. Pour lire un fichier plat, il faut déterminer le nom et le nombre de variables à prendre en compte :

Code sas : Sélectionner tout
1
2
3
4
5
6
DATA equipe; 
INFILE "coatch.txt"; 
INPUT nom$ anneecreation nbjoueur; 
RUN; 
PROC PRINT DATA=equipe; 
RUN;
INFILE permet donc de lire des fichiers plats suivis entre " " de leur nom.

Mis à jour le 1er mars 2008 Fleur-Anne.Blain

Afin de lire les données correctement, pour chaque tuple un utilisateur SAS est contraint de les saisir ou enregistrer ligne par ligne. Il est possible de tout mettre sur une même ligne avec une instruction précise.

Pour comprendre le problème, regardons le programme suivant :

Code sas : Sélectionner tout
1
2
3
4
5
6
7
8
DATA equipe;  
INPUT nom$ :20. anneecreation nbjoueur; 
CARDS; 
sharks 1950 12 tigers 1951 33 lions 2000 42 zodiac 2006 11 flyers 2007 42 
; 
RUN; 
PROC PRINT DATA=equipe; 
RUN;
Toutes les données sont sur une unique ligne. Cependant, à l'exécution de notre programme SAS il n'a été pris en compte que ceci :

Code sas : Sélectionner tout
1
2
Obs nom anneecreation nbjoueur 
1 sharks 1950 12
Donc même si toutes les données sont sur une seule ligne tout n'est pas pris en compte. Pour lire des données saisies sur une ligne unique il suffit d'ajouter l'instruction @@ dans la section INPUT de votre programme comme suit :

Code sas : Sélectionner tout
1
2
3
4
5
6
7
8
DATA equipe;  
INPUT nom$ :20. anneecreation nbjoueur @@; 
CARDS; 
sharks 1950 12 tigers 1951 33 lions 2000 42 zodiac 2006 11 flyers 2007 42 
; 
RUN; 
PROC PRINT DATA=equipe; 
RUN;
Et nous obtenons bien le résultat voulu :

Code sas : Sélectionner tout
1
2
3
4
5
6
Obs nom anneecreation nbjoueur 
1 sharks 1950 12 
2 tigers 1951 33 
3 lions 2000 42 
4 zodiac 2006 11 
5 flyers 2007 42

Mis à jour le 1er mars 2008 Fleur-Anne.Blain

Si les deux tables qu'on souhaite merger contiennent des doublons => résultat du merge est faux, dans ce cas il faut utiliser une proc SQL avec un full join. Le merge ne peut être utilisé que s'il y a des doublons dans une seule table.

Mis à jour le 27 mai 2008 bahraoui

Pour créer une table vide vous avez deux solutions : soit utiliser du SQL (PROC SQL) soit utiliser une étape DATA.

Pour l'étape DATA vous devez procéder comme suit :

Code sas : Sélectionner tout
1
2
3
4
DATA VIDE; 
SET _NULL_; 
length a 3; 
run;
Ou comme suit :

Code sas : Sélectionner tout
1
2
DATA vide; length a 3.; stop; 
run;
Et pour le SQL :

Code sas : Sélectionner tout
1
2
3
proc sql; 
CREATE TABLE tab  (a int); 
quit;

Mis à jour le 10 octobre 2008 fafabzh6

Dans une étape DATA, vous pouvez à l'aide de l'option RETAIN changer l'ordre d'impression des variables (ou colonnes) d'une table.

Code sas : Sélectionner tout
1
2
3
4
5
6
7
8
9
10
11
12
13
DATA base; 
INPUT v1 v2; 
CARDS; 
1 2 
10 3 
; 
RUN; 
DATA base; 
RETAIN v2 v1; 
SET base; 
RUN; 
PROC PRINT DATA=base2; 
RUN;

Mis à jour le 10 octobre 2008 fafabzh6

La fonction LAG vous permet de faire ce genre de manipulation.

Code sas : Sélectionner tout
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
DATA one; 
length n 8; 
input n @@; 
y=lag1(n); 
cards; 
3 5 . 6 1 4 
; 
run; 
  
DATA _null_; 
SET One; 
IF y > x then  
put 'Y plus grand que X'; 
else 
put 'Y plus petit que X'; 
run;
Résultat de la log

Code sas : Sélectionner tout
1
2
3
4
5
6
Y plus petit que X 
Y plus petit que X 
Y plus grand que X 
Y plus petit que X 
Y plus grand que X 
Y plus petit que X
Contenu du Dataset One

Code sas : Sélectionner tout
1
2
3
4
5
6
7
X Y 
3 . 
5 3 
. 5 
6 . 
1 6 
4 1

Mis à jour le 10 octobre 2008 Oncle_Pete

Il suffit d'ajouter ce bout de code à votre programme SAS

Code sas : Sélectionner tout
1
2
PROC CONTENTS; 
RUN;
PROC CONTENTS est une procédure SAS qui permet d'obtenir le nombre d'observations (ou de lignes), le nombre de variables, le nom de la table ou encore la date de création.

Mis à jour le 1er mars 2008 Fleur-Anne.Blain

Suppression de toutes les tables de l'espace work :

Code sas : Sélectionner tout
1
2
3
proc datasets lib=work KILL; 
run; 
quit;
Suppression de la table T1 de l'espace work :

Code sas : Sélectionner tout
1
2
3
4
proc datasets lib=work ; 
DELETE t1; 
run; 
quit;

Mis à jour le 27 mai 2008 bahraoui

Si un fichier de données de type texte est compressé au format zip. Il existe un moyen de le lire directement sans le décompresser. Il suffit d'utiliser l'utilitaire PKUNZIP.EXE de décompression des fichiers au format ZIP. L'instruction FILENAME comprend l'option PIPE qui permet d'exécuter une commande lors de son appel.

Exemple de décompression de fichier de type ZIP :

Code sas : Sélectionner tout
1
2
3
4
5
filename fichier pipe 'c:\pkunzip.exe c:\fichier.zip -c' ; 
   data a ; 
    infile fichier dlm=',' ; /* le caractère " , " est le délimiteur de champs */ 
    input A $ B $ C $ ; /* le fichier texte contient 3 champs de type caractère */ 
   run ;
L'option " -c " permet d'extraire les données du fichier texte directement vers une console DOS et non vers le disque dur.
Le Système SAS® lira les informations affichées sur la mire DOS.

Il est important de noter les points suivants :

  • il ne faut pas lire les premières lignes de la mire DOS. Elles concernent seulement l'utilitaire PKUNZIP.EXE. (Pour ce faire, utiliser l'instruction FIRSTOBS= ) ;
  • le fichier compressé au format ZIP ne doit contenir qu'un seul fichier texte ;
  • ce traitement est plus long lors de la lecture des données.

Mis à jour le 10 octobre 2008 sas

Vous pouvez utiliser un ARRAY qui référence toutes les variables numériques. L'avantage principal de cette méthode est double :

  • il n'est pas nécessaire de connaître le nom des variables ;
  • il n'est pas nécessaire de connaître le nombre de variables.

Le macroprogramme ci-dessous prend en paramètre le nom de la table SAS en entrée.

Code sas : Sélectionner tout
1
2
3
4
5
6
7
8
9
10
%Macro M_Zero (ds=) ; 
     data &ds.2 (drop=_i); 
          set &ds ; 
          array A_VarNum[*] _NUMERIC_ ;       
  
          do _i=1 to dim( A_VarNum ) ; 
          If A_VarNum (_i)=. then A_VarNum (_i)=0 ; 
     End ; 
   run ; 
%Mend ;

Mis à jour le 10 octobre 2008 sas

Vous pouvez utiliser cette syntaxe :

Code sas : Sélectionner tout
Put var1 +(-1) var2;
Exemple :

Code sas : Sélectionner tout
1
2
3
4
5
6
data _null_ ; 
file "c:\temp\test.txt" ; 
var1="aaa" ; 
var2="111" ; 
put var1 +(-1) var2; 
run ;
Contenu de test.txt :
aaa111

Pour en savoir plus : depuis le sommaire de l'aide en ligne, sélectionner SAS Products > Base SAS > SAS Language dictionary > Dictionay of language elements > Statements > PUT Statement > Column Pointer Controls.

Mis à jour le 10 octobre 2008 sas

Code sas : Sélectionner tout
1
2
3
4
5
6
PROC SQL ; 
   CREATE TABLE base AS 
   SELECT *,'cpt' || PUT(monotonic(), 8. -L) AS compteur 
   FROM sashelp.air 
   ; 
QUIT;

Mis à jour le 11 avril 2014 fafabzh6

On distingue deux types de données possibles à lire : les données alphanumériques et les données numériques. Toutes deux ne se lisent pas de la même manière pour pouvoir ensuite les présenter en fenêtre de sortie.
Nous allons répondre à travers un petit programme :

Code sas : Sélectionner tout
1
2
3
4
5
6
7
8
9
10
DATA equipe;  
INPUT nom$ anneecreation nbjoueur; 
CARDS; 
sharks 1950 12 
tigers 1951 33 
lions 2000 42 
zodiac 2006 11 
flyers 2007 42 
; 
RUN;
L'étape DATA nous permet de créer un tableau appelé equipe.
INPUT nous permet de signaler les variables à lire. INPUT est donc suivi de leurs déclarations.
Une donnée alphanumérique voit son nom de variable obligatoirement suivi par le signe $.
CARDS signifie que les données vont être entrées à la suite et dans l'ordre dans le programme.
RUN exécute toutes les lignes de code le précédant. Obligatoire pour l'exécution donc.

Mis à jour le 1er mars 2008 Fleur-Anne.Blain

Afin d'éviter que les données soient tronquées, il est possible de spécifier une taille, soit un nombre de caractères, disponible pour afficher les données.

Nous allons répondre à travers un petit programme :

Code sas : Sélectionner tout
1
2
3
4
5
6
7
8
9
10
DATA equipe;  
INPUT nom$ :20. anneecreation nbjoueur; 
CARDS; 
sharks 1950 12 
tigers 1951 33 
lions 2000 42 
zodiac 2006 11 
flyers 2007 42 
; 
RUN;
Dans cet exemple, nous avons spécifié une taille pour la variable nom. Un nom d'équipe disposera de 20 caractères maximum à l'affichage. Pour cela, il est impératif de mettre "nb" après la variable en question dans la section INPUT de votre programme. Bien entendu, "nb" est à remplacer par n'importe quelle valeur entière.

Mis à jour le 1er mars 2008 Fleur-Anne.Blain

Pour changer le nom d'une table SAS vous devez utiliser la procédure DATASETS avec l'option CHANGE comme suit :

Code sas : Sélectionner tout
1
2
3
4
5
6
7
8
PROC SQL; 
CREATE TABLE tab  (a int); 
QUIT; 
  
PROC datasets lib=work; 
CHANGE tab=tab_new; 
run; 
quit;

Mis à jour le 10 octobre 2008 fafabzh6

Pour rajouter un identifiant de type numéro automatique vous pouvez utiliser la fonction _N_ dans une étape DATA.

Code sas : Sélectionner tout
1
2
3
4
5
6
7
8
9
10
11
DATA base; 
INPUT v1 v2; 
CARDS; 
9 5 
10 3 
; 
RUN; 
DATA base2; 
SET base; 
id=_N_; 
RUN;

Mis à jour le 10 octobre 2008 fafabzh6

Pour pouvoir importer ce type de fichier, il faut avoir installé SAS DBCS avec prise en charge Unicode.

Ensuite :

  • démarrer « SAS 9.1 English with DBCS and Unicode support » avec l'option encoding UTF8 dans la commande de démarrage ;
  • importer le fichier texte via une étape DATA en incluant l'encoding correct du fichier dans l'instruction Infile (ex : encoding=unicode) ;
  • repérer les variables contenant les caractères spécifiques à une langue, puis les transformer comme suit avec la fonction KCVT dans l'étape DATA: Out =kcvt (in,"Encoding_entrée","Encoding_sortie").

Exemple :

Code sas : Sélectionner tout
1
2
3
4
5
data table; 
  infile "C:\exemple\extract.txt" lrecl=64000 firstobs=2 encoding=unicode ignoredoseof dsd missover dlm='09'x ; 
  input var1 var2 ; 
    Var1 =kcvt (var1,"UTF8","wlatin2");   
Run ;
UTF8 car l'option placée au démarrage de SAS modifie automatiquement tous les encoding à UTF8. WLATIN2 : pour les caractères de l'Europe centrale (Pologne, Croatie, etc.). Pour les caractères français, l'encoding est WLATIN1.

Mis à jour le 11 décembre 2009 sas

Et si notre nom d'équipe était en deux parties (séparées par un espace) ? Pour SAS un espace correspond à la valeur suivante :

Code sas : Sélectionner tout
1
2
3
4
5
6
DATA equipe; 
INFILE "coatch.txt"; 
INPUT nom$ 1-10 anneecreation 13-16 nbjoueur; 
RUN; 
PROC PRINT DATA=equipe; 
RUN;
Ce que nous venons d'ajouter signifie que les données de la variable nom peuvent être sur 10 caractères maximum, que l'année de création de l'équipe est sur 4 caractères.

Cette méthode permet donc de spécifier les positions des variables, ou leur taille (en comptant le nombre de caractères y compris les blancs). Résultat : nous affichons les blancs et pas de décalage de données en sortie.

Mis à jour le 1er mars 2008 Fleur-Anne.Blain

Parfois, lors d'une étape DATA on aimerait savoir sur quelle ligne on se trouve, ou alors lors de l'affichage (PROC PRINT) on aimerait sélectionner les lignes à afficher en fonction de leur numéro de ligne. Lors d'un DATA, la table crée une variable automatique _N_, qui correspond au numéro de ligne. Cette variable disparaît après la fin du DATA, mais on peut la conserver dans une variable.

Le code suivant met le numéro de la ligne dans la variable v2 :

Code sas : Sélectionner tout
1
2
3
4
5
6
7
8
9
10
11
12
DATA base; 
ATTRIB v1 LENGTH=$1. LABEL="Ma premiere variable"; 
ATTRIB v2 LENGTH=8. LABEL="Ma deuxieme variable"; 
v2=_N_; 
input v1; 
cards; 
a 
b 
c 
d 
;   
RUN;
Le code suivant affiche les deux premières lignes de cette table :

Code sas : Sélectionner tout
1
2
3
PROC PRINT DATA=base LABEL; 
WHERE v2 LE 2; 
RUN;

Mis à jour le 27 mai 2008 rastoix

Pour dupliquer une ligne particulière d'une table SAS vous pouvez utiliser l'option OUTPUT dans une étape DATA.

Code sas : Sélectionner tout
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
DATA toto2; 
format cle $10. frequence 5. effectif 5.; 
input cle $ frequence effectif; 
cards; 
rean 10 . 
tutu 80 . 
titi 1 . 
tata 90 . 
k  . 2 
k  . 1 
; 
run; 
  
DATA toto22; SET toto2; 
IF cle='tutu' then output; 
output; 
run;

Mis à jour le 10 octobre 2008 fafabzh6

Pour trier un tableau d'observations avec une ou plusieurs variables, il faut utiliser la procédure PROC SORT et la commande BY
suivie des noms de variables de tri souhaité. Ce tri peut être croissant ou décroissant.
Prenons l'exemple suivant :

Code sas : Sélectionner tout
1
2
3
4
5
6
7
8
9
10
11
12
13
DATA equipe;  
INPUT nom$ :20. anneecreation nbjoueur; 
CARDS; 
sharks 1950 12 
tigers 1951 33 
lions 2000 42 
zodiac 2006 11 
flyers 2007 42 
; 
RUN; 
PROC SORT DATA=equipe OUT=equipe_triee;            
BY nom anneecreation nbjoueur; 
RUN;
Pour un tri décroissant de ce même programme, il suffit de remplacer la PROC SORT par ceci :

Code sas : Sélectionner tout
1
2
3
PROC SORT DATA=equipe OUT=equipe_triee;           
BY DESCENDING nom anneecreation nbjoueur; 
RUN;
Attention ce tri ne sera décroissant que pour la variable nom, les autres resteront par défaut croissants.

Mis à jour le 16 mars 2008 Fleur-Anne.Blain

Code sas : Sélectionner tout
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
DATA t1; 
input a b; 
cards; 
1 2 
1 4 
2 6 
3 4 
3 3 
5 6 
4 8 
; 
run; 
/*V9*/ 
proc sort DATA=t1  out=tr_tr nodupkey dupout=tr_dup; BY a;run; 
/*V8 ou V9*/ 
proc freq DATA=t1 ; TABLES a/out=t1_fr(WHERE=(COUNT>1)); run; 
proc sql; 
CREATE TABLE t1_v9_dup AS 
SELECT al_1.* 
FROM t1 al_1,  t1_fr al_2 
WHERE al_1.a=al_2.a; 
quit;

Mis à jour le 27 mai 2008 bahraoui

Certains traitements peuvent être répétitifs. Il nous faut donc utiliser une boucle afin d'optimiser le traitement.

Prenons un exemple simple qui va réaliser une boucle de 1 à 10 durant laquelle on effectuera un traitement simple : prendre la valeur et la multiplier par 10.

Code sas : Sélectionner tout
1
2
3
4
5
6
DATA tab_boucles; 
DO i=0 TO 10 BY 1; 
v= i*10; 
OUTPUT tab_boucles; 
END; 
RUN;
Pour réaliser une boucle, il y a quatre mots-clés :

* DO
* TO
* BY
* END

Mis à jour le 16 mars 2008 Fleur-Anne.Blain

Une solution possible consiste à utiliser l'option "RENAME", à l'intérieur d'une étape "DATA".

Ci-dessous, un exemple de code SAS utilisant l'option "RENAME" :

Code sas : Sélectionner tout
1
2
3
4
5
6
7
8
9
10
11
DATA base; 
INPUT var1 var2; 
CARDS; 
10 5  
3 8 
; 
DATA base2; 
SET base; 
RENAME var1=variable1; 
RENAME var2=v2; 
RUN;
La table "base" contient deux variables : les variables "var1" et "var2". Grâce à l'option "RENAME", nous avons renommé la variable "var1" en "variable1" et la variable "var2" en "v2".

Mis à jour le 10 octobre 2008 fafabzh6

Code sas : Sélectionner tout
1
2
3
4
5
6
7
DATA titi; 
    dsid=open("sashelp.adomsg"); /*ouvrir la table*/ 
    pw=attrn(dsid,"NOBS ");/*obtenir le nombre d'obs, la fonction attrn peut recevoir d'autres paramètres NOBS NVARS...*/ 
    rc=close(dsid);/*ermer la table*/ 
run; 
proc contents DATA=sashelp.adomsg out=t noprint; run; 
/*Avec la proc contents on obtient beaucoup plus d'informations*/

Mis à jour le 27 mai 2008 bahraoui

Il faut utiliser le format $char2. permettant à SAS d'interpréter le caractère ?.' ainsi que l'option TRUNCOVER pour revenir à la ligne lors de l'importation des données.

Exemple :

À partir du fichier présent dans C:\FAQ.txt contenant les données suivantes :

Code sas : Sélectionner tout
1
2
3
4
5
6
7
8
9
10
11
12
13
14
var1 var2 
            1 . 
            2 . 
            3 y 
            4 z 
            5 r 
            6 r 
  
data test; 
  
infile 'C:\FAQ.txt' delimiter='09'x firstobs=2 truncover; 
input var1 var2 $char2. ; 
  
run;

Mis à jour le 10 octobre 2008 sas

Proposer une nouvelle réponse sur la FAQ

Ce n'est pas l'endroit pour poser des questions, allez plutôt sur le forum de la rubrique pour ça


Réponse à la question

Liens sous la question
précédent sommaire suivant
 

Les sources présentées sur cette page sont libres de droits et vous pouvez les utiliser à votre convenance. Par contre, la page de présentation constitue une œuvre intellectuelle protégée par les droits d'auteur. Copyright © 2020 Developpez Developpez LLC. Tous droits réservés Developpez LLC. Aucune reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu'à trois ans de prison et jusqu'à 300 000 € de dommages et intérêts.