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 utiliser du SQL avec SAS ?
- Comment tester la validité de la saisie utilisateur et lui retourner la position de son éventuelle erreur ?
- Quelle est la différence entre if et where dans une étape data ?
- Comment réparer toutes les tables d'une bibliothèque ?
- Quelle est la limite d'une table SAS ?
- Comment vérifier l'état de la base de registre SAS ?
- Peut-on avoir plusieurs serveurs de métadonnées SAS 9 sur la même machine ?
- Comment importer le contenu d'un répertoire dans un dataset ?
- Comment accéder aux données stockées dans un fichier binaire SAS ?
- Comment ajouter du texte dans un fichier ?
- Comment lire un fichier hébergé par un serveur internet ou intranet à l'aide d'une instruction FILENAME en version 8 ?
- En version 8 du Système SAS, on obtient parfois des tables SAS avec une extension .sd7 et non .sas7bdat. Comment peut-on lire ces tables en version 8, et comment convertir les fichiers en .sas7bdat ?
- Comment créer une table SAS à partir de plusieurs fichiers texte, stockés dans un même répertoire, en commençant la lecture des observations sur la nième ligne ?
- Comment lire des données depuis un port série ou parallèle du PC ?
- Lors de l'exécution d'un programme en batch, dès qu'une erreur intervient, pourquoi la suite du programme n'est-elle pas exécutée ?
- Comment crypter un mot de passe utilisateur depuis SAS 9 ?
- Dans une étape DATA, comment récupérer le nom de la table en cours d'exécution ?
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; |
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; |
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.
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; |
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.
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 |
Oui, pour cela il est nécessaire d'utiliser différents ports pour chaque serveur de métadonnées.
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; |
Cet exemple fonctionne avec d'autres commandes système aussi bien sur Windows que sur Unix.
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; |
Remarque :
le chemin spécifié peut bien évidemment être différent.
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; |
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; |
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 ; |
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;
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; |
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; |
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; |
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.
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; |
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; |
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.