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.
- Comment lire un fichier plat et l'exploiter dans un programme SAS ?
- Comment lire des données saisies sur une seule ligne ?
- Quelles sont les limites de la fusion horizontale avec un merge ?
- Comment créer une table vide ?
- Comment changer l'ordre des variables (ou colonnes) d'une table ?
- Comment garder en mémoire la valeur de la dernière variable lue ?
- Comment afficher les informations générales d'un tableau SAS ?
- Comment supprimer une table SAS ?
- Comment lire un fichier de données de type texte contenu dans un fichier de type ZIP ?
- Comment remplacer toutes les valeurs manquantes d'une table par 0 ?
- Lors de la création d'un fichier texte, l'instruction « put var1 var2 » insère un espace entre les champs. Comment ne pas avoir cet espace ?
- Comment créer une variable compteur de type chaine de caractères avec une PROC SQL ?
- Comment lire des données alphanumériques et numériques dans un programme SAS ?
- Comment fixer une taille à nos variables ?
- Comment changer le nom d'une table SAS ?
- Comment rajouter un identifiant de type numéro automatique à une table ?
- Comment importer un fichier texte contenant des langues différentes ?
- Comment lire des données qui contiennent des espaces dans un programme SAS ?
- Comment accéder au numéro de la ligne de la table SAS ?
- Comment dupliquer une ligne particulière ?
- Comment trier un tableau d'observations selon une ou plusieurs variables ?
- Comment extraire les doublons d'une table ?
- Comment réaliser une boucle dans une table SAS ?
- Comment renommer les variables d'une table SAS ?
- Comment récupérer le nombre d'observations d'une table ?
- Comment importer des données d'un fichier texte dans SAS en conservant les variables caractères à point ?
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; |
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; |
Code sas : | Sélectionner tout |
1 2 | Obs nom anneecreation nbjoueur 1 sharks 1950 12 |
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; |
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 |
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.
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; |
Code sas : | Sélectionner tout |
1 2 | DATA vide; length a 3.; stop; run; |
Code sas : | Sélectionner tout |
1 2 3 | proc sql; CREATE TABLE tab (a int); quit; |
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; |
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; |
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 |
Code sas : | Sélectionner tout |
1 2 3 4 5 6 7 | X Y 3 . 5 3 . 5 6 . 1 6 4 1 |
Il suffit d'ajouter ce bout de code à votre programme SAS
Code sas : | Sélectionner tout |
1 2 | PROC CONTENTS; RUN; |
Suppression de toutes les tables de l'espace work :
Code sas : | Sélectionner tout |
1 2 3 | proc datasets lib=work KILL; run; quit; |
Code sas : | Sélectionner tout |
1 2 3 4 | proc datasets lib=work ; DELETE t1; run; quit; |
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 ; |
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.
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 ; |
Vous pouvez utiliser cette syntaxe :
Code sas : | Sélectionner tout |
Put var1 +(-1) var2;
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 ; |
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.
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; |
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; |
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.
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; |
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; |
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; |
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 ; |
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; |
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.
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; |
Code sas : | Sélectionner tout |
1 2 3 | PROC PRINT DATA=base LABEL; WHERE v2 LE 2; RUN; |
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; |
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; |
Code sas : | Sélectionner tout |
1 2 3 | PROC SORT DATA=equipe OUT=equipe_triee; BY DESCENDING nom anneecreation nbjoueur; RUN; |
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; |
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; |
* DO
* TO
* BY
* END
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; |
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*/ |
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; |
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 çaLes 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 © 2024 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.