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 BASEPropriétés intéressantes (17)
précédent sommaire suivant
 

La procédure PROC SQL permet de manipuler le langage SQL avec SAS.

Code sas : Sélectionner tout
1
2
3
PROC SQL; 
SELECT * FROM base; 
QUIT;

Mis à jour le 1er mars 2008 fafabzh6

La fonction UTILITY 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
DATA CHECK; 
length Autorise $10 MaChaine $50; 
Autorise='abcdf';/* ce sont les caractères autorisés */ 
Machaine='abcbcdfaaqabddb'; 
x = verify(Machaine, autorise); 
run; 
  
Ici X=10. verify ne retourne la position que du 1er caractère interdit. 
  
DATA _null_; 
SET CHECK; 
lettre = substr(Machaine, x, 1); 
Put 'La lettre ' lettre ' est incorrecte'; 
run;

Mis à jour le 10 octobre 2008 Oncle_Pete

En deux mots : l'instruction where s'applique avant le chargement d'enregistrements dans la mémoire, l'instruction if - après. Sinon :

  • L'utilisation de where est en général plus rapide que celle de if. Au moins parce qu'avec where SAS n'est pas obligé de charger (et éventuellement traiter) des enregistrements inutiles (filtrés par la condition). En plus, avec where SAS peut utiliser les index pour améliorer la performance ;
  • L'utilisation de if est plus riche. En effet, avec where on ne peut utiliser que des variables présentes dans la table source. Tandis que dans les conditions de if on peut également inclure des variables systèmes (_N_, etc.) et des variables résultant des calculs de cette même étape data.

Mis à jour le 10 octobre 2008 green_fr

Voici un exemple de code qui permet de réparer toutes les tables contenues dans la bibliothèque MYLIB.

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
23
24
libname MYLIB "C:\SASWorkspace\test"; 
  
%macro  repair ; 
  %do i=1%to &dscount; 
        repair &&ds&i; 
  %end; 
%mend; 
  
proc sql; 
  create table work.listing as 
  select memname 
    from sashelp.vtable 
      where trim(upcase(libname)) = "MYLIB"; 
quit; 
  
data _null_; 
  set work.listing; 
  call symput("ds"||trim(left(_N_)), memname); 
  call symput("dscount", _N_); 
run; 
  
proc datasets lib= MYLIB nolist; 
  % repair ; 
run;

Mis à jour le 7 novembre 2011 sas

Une table SAS V8 a pour limite 32 767 variables. Cette limite n'existe pas en SAS9. Quant au nombre d'observations il n'y a pas de limite SAS, cela est lié au système d'exploitation.

Mis à jour le 10 octobre 2008 sas

La procédure REGISTRY permet de valider l'état de la base de registre SAS :

Code sas : Sélectionner tout
1
2
3
4
5
6
7
8
9
10
11
12
13
14
PROC REGISTRY RUTHERE; 
RUN; 
  
La log SAS doit retourner le message suivant : 
  
****** Validating the SASHELP Registry *********************** 
The SASHELP Registry is set to read only access. 
The SASHELP Registry has data and looks OK. 
****** Validating the SASUSER Registry *********************** 
The SASUSER Registry is set to read/write access. 
The SASUSER Registry has data and looks OK. 
NOTE: PROCEDURE REGISTRY used: 
real time 0.03 seconds 
cpu time 0.00 seconds

Mis à jour le 10 octobre 2008 sas

Oui, pour cela il est nécessaire d'utiliser différents ports pour chaque serveur de métadonnées.

Mis à jour le 10 octobre 2008 sas

Voici le code pour importer le contenu d'un répertoire dans un dataset :

Code sas : Sélectionner tout
1
2
3
4
5
6
7
8
9
10
11
12
13
options noxwait xsync;  
/* noxwait : masque l'invite de commande 
  xsync : attend l'exécution de la commande  
 avant de poursuivre le traitement  
*/ 
  
filename cmd pipe "Dir /B C:\"; /* Commande DOS pour lister C:\ */ 
  
data contenu_disque_c; 
format var $500.; 
infile cmd DSD MISSOVER; /* lecture du filename */ 
input var $; 
run;
Au travers du filename pipe, SAS lit le résultat de la commande DOS comme un fichier.
Cet exemple fonctionne avec d'autres commandes système aussi bien sur Windows que sur Unix.

Mis à jour le 1er mars 2008 steelspirit

Code sas : Sélectionner tout
1
2
3
4
5
6
LIBNAME repdata 'c:\Documents and Settings\';  
DATA monfichier; 
SET repdata.tab; 
RUN; 
PROC PRINT data=monfichier; 
RUN;
L'instruction LIBNAME permet de spécifier le chemin d'accès au fichier. L'instruction SET signifie que l'on reprend un tableau existant, soit ici tab.

Remarque :
le chemin spécifié peut bien évidemment être différent.

Mis à jour le 1er 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
/***************************************/ 
/* Code SAS pour lire le contenu d'un fichier et l'insérer à la fin d'un autre fichier txt*/ 
/***************************************/ 
  
Filename FilInput "G:\fichierlecture.txt"; 
Filename FilOut "G:\FichierSortie.txt"; 
  
DATA _null_; 
/* lecture du fichier externe */ 
length enregis $200; 
INFILE FilInput dlm='£'; /* afin de lire la totalité de l'enregistrement, la probabilité de trouver ce caractère étant limitée */ 
input enregis; 
/* écriture dans le fichier de sortie (comme le mode append) */ 
file FilOut mod; 
put enregis; 
run;

Mis à jour le 10 octobre 2008 Oncle_Pete

Il suffit de déclarer une instruction FILENAME avec l'option URL pour spécifier le lien Web (ou URL) pour trouver votre fichier.
Exemple de lecture d'un fichier du Web :

Code sas : Sélectionner tout
1
2
3
4
5
6
7
8
9
10
11
12
// Déclaration d'un FILENAME de lecture avec le lien vers la page à lire. 
filename web url 'http://www.addresse/vers/ma/page.html' ; 
  
// Déclaration d'un FILENAME d'écriture. 
filename test 'c:\temp\test.html'; 
  
data _null_; 
n=-1; 
infile web recfm=s nbyte=n length=len _infile_=tmp; 
input; 
file test recfm=n; put tmp $varying32767. len; 
run;
Attention
Le programme ci-dessus fonctionne correctement dans le cas où vous n'utilisez pas de machine PROXY pour vos connexions Intranet/Internet. Dans le cas où vous recevez l'erreur " ERROR: service httpd not found" , c'est qu'il n'arrive pas à contacter le lien demandé. Dans ce cas, une machine PROXY est utilisée. Vous devez déclarer son adresse Web lors de l'exécution de l'instruction FILENAME. L'option DEBUG permet juste d'avoir plus d'informations sur la lecture du fichier et n'est pas indispensable.

Exemple :

Code sas : Sélectionner tout
1
2
filename web url 'http://www.addresse/vers/ma/page.html' 
proxy='http://proxy2.eur.sas.com.:3128/' debug ;

Mis à jour le 10 octobre 2008 sas

1/ Pour pouvoir lire ces tables en version 8 , il faut créer une bibliothèque particulière avec l'option SHORTFILEEXT.
Exemple :

Code sas : Sélectionner tout
libname mylib 'c:\mysasdata' shortfileext;
2/ Pour convertir une table .sd7 en .sas7bdat, il suffit d'utiliser une proc copy pour convertir les données de la bibliothèque créée ci-dessus vers une bibliothèque 'standard'.
Exemple :

Code sas : Sélectionner tout
1
2
3
4
5
libname mylib 'c:\mysasdata' shortfileext; 
libname mylibfinal 'c:\newdata'; 
  
proc copy in=mylib out=mylibfinal; 
run;

Mis à jour le 10 octobre 2008 sas

L'utilisation d'un FILENAME avec l'option PIPE va vous permettre dans un premier temps d'utiliser la commande DOS pour lister les fichiers.
Ensuite, vous devez combiner les options FILEVAR et FIRSTOBS de l'instruction INFILE.
L'exemple de code ci-dessous liste l'ensemble des fichiers texte présents dans le répertoire « c:\temp\text files », puis lit ces fichiers à partir de la 2e ligne. Tous les fichiers ont la même structure.

Code sas : Sélectionner tout
1
2
3
4
5
6
7
8
9
10
11
12
%let dir=%bquote(")C:\temp\text files%bquote("); 
filename test pipe "dir &dir /b /s"; 
  
data f2r; 
infile test truncover; 
input ftr $200.; 
infile test filevar=ftr truncover end=done firstobs=2; 
  do while(not done); 
    input var1 var2 var3 ; 
    output; 
  end; 
run;

Mis à jour le 10 octobre 2008 sas

Pour rappel :

  • '1a'x est la valeur hexadécimale de fin de fichier (EOF) ;
  • '0D0A'x est la valeur hexadécimale de fin de page et de fin de ligne ;
  • '0A'x est la valeur hexadécimale de fin de ligne ;
  • F signifie Fixed format.

Code sas : Sélectionner tout
1
2
3
4
5
6
7
Filename port commport 'lpt1:'; /* OU Filename port commport 'com1:';*/ 
  
DATA acquisition; 
INFILE port lrecl=1 recfm=f unbuffered; 
input i s; 
IF i = '1a'x then stop; 
run;

Mis à jour le 10 octobre 2008 Oncle_Pete

Parce que, par défaut, en batch, SAS est démarré en mode « Syntaxcheck ». Donc, dès qu'une erreur est rencontrée, l'option obs est positionnée à 0 (toutes les tables créées seront donc vides) et le code est simplement validé mais non exécuté. Pour obtenir le même comportement en batch qu'en interactif, il faut ajouter l'option no$syntaxcheck à l'appel de SAS.

Mis à jour le 10 octobre 2008 sas

Vous pouvez être amenés à spécifier des mots de passe d'utilisateur lorsque vous travaillez avec SAS. Pour crypter ces mots de passe, vous pouvez utiliser la procédure PWENCODE disponible depuis SAS 9.1.

Code sas : Sélectionner tout
1
2
PROC PWENCODE in="your-pw"; 
RUN;
Aide en ligne The PWENCODE Procedure Aide support SAS 16

Mis à jour le 10 octobre 2008 sas

Pour récupérer le nom de la table en cours d'exécution vous devez utiliser l'option INDSNAME comme suit :

Code : 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
23
DATA base1; 
INPUT X Y; 
CARDS; 
1 2  
3 4 
5 6 
; 
RUN; 
DATA base2; 
INPUT X Z; 
CARDS; 
1 10 
5 7 
8 12 
; 
RUN; 
DATA base; 
   SET base1 base2 INDSNAME =exec; 
   BY X; 
   table=exec; 
RUN; 
PROC PRINT DATA=base; 
RUN;

Mis à jour le 4 août 2014 fafabzh6

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.