SAS/BASE®
QUESTIONS
- Comment utiliser la macro-variable SYSDATE ? Réponse
- Comment lire un fichier de données de type texte contenu dans un fichier
de type ZIP ? Réponse
- Comment calculer les numéros de semaine ? Réponse
- 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 ? Réponse
- Comment lire un fichier hébergé par un serveur internet
ou intranet à l'aide d'une instruction FILENAME en version 8 ?
Réponse
- Comment supprimer l'affichage des numéros de pages dans l'output
? Réponse
- Comment faire pour convertir une variable numérique en variable
caractère, et inversement ? Réponse
- Comment remplacer toutes les valeurs manquantes d'une table par 0 ?
Réponse
- Comment procéder pour que plusieurs utilisateurs puissent accéder
de façon simultanée à un catalogue de macro procédures
compilées ? Réponse
- 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 ? Réponse
- Comment exporter chaque table d’une bibliothèque dans un
classeur Excel ? Réponse
- Quelle est la limite d’une table SAS ? Réponse
- Comment utiliser les variables d’environnement système
dans un programme SAS ? Réponse
- Comment vérifier l’état de la base registre SAS
? Réponse
- Comment conserver les dix meilleurs résultats (top ten) obtenus
par groupe ? Réponse
- (SAS9) Où puis je voir la documentation en ligne SAS9 ? Réponse
- (SAS9) Peut-on avoir plusieurs serveurs de Méta-données SAS9 sur la
même machine ? Réponse
- (SAS9) Comment crypter un mot de passe utilisateur depuis SAS ? Réponse
- (SAS 9) Comment récupérer des informations relatives au
JRE (Java Runtime Environment) associéà SAS Foundation ?
Réponse
- Comment extraire une date/heure d’une variable datetime ? Réponse
- Comment diminuer le contenu de la log SAS ? Réponse
- Comment vider la log depuis la fenêtre "Program Editor"
? Réponse
- Comment exécuter une étape data sans l’afficher
dans la log ? Réponse
- Comment à partir d'une table sas contenant les adresses emails
et des chemins de fichiers, peut-on envoyer plusieurs fichiers en pièces
jointes d'un mail avec SAS 8.2 ? Réponse
- Comment interpréter les tests en sortie de la procédure
UNIVARIATE ? Réponse
- (SAS9) Comment forcer l’importation des dates de fichiers Excel
en format « datetime.» ? Réponse
- Est-il possible de modifier le nombre de lignes maximum écrites
dans les fenêtres Log et Output ? Ceci afin d’éviter
l’ouverture d’une fenêtre indiquant « Window Full
». Réponse
- 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 ? Réponse
- Comment générer une variable numérique ou caractère
de manière aléatoire ? Réponse
- Comment créer un format pour afficher la date ou un datetime
au format dd/mm/yyyy ? Réponse
- Comment importer des données d'un fichier texte dans SAS en conservant
les variables caractères à points ? Réponse
- Comment récupérer le nombre d’observations d’une
table dans une macro variable ? Réponse
- Comment obtenir la liste des formats présents dans une bibliothèque
? Réponse
- Comment créer un alias pour le moteur SASIOIME ? Réponse
- En SAS®9, dans une chaîne de caractères, comment mettre la première lettre de chaque mot en majuscule et les autres lettres en minuscule ? Réponse
- Comment mettre à jour un programme ouvert et modifié par plusieurs personnes en même temps ? Réponse
- Comment supprimer un format par programme SAS ? Réponse
- Comment créer une table SAS à partir de plusieurs fichiers texte, stocké dans un même répertoire, en commençant la lecture des observations sur la Nième ligne ? Réponse
- Depuis SAS, comment envoyer un email en insérant du texte formaté dans le corps du message ? Réponse
- En SAS9, comment extraire la position d’un mot d’une chaîne de caractère sans être sensible à la casse ? Réponse
- L’aide en ligne du tagset ExcelXP pour PRINT_HEADER ne donne pas toujours la bonne syntaxe. Réponse
- Comment savoir si l’exécution d’un programme est terminée ? Réponse
- Lorsque j’imprime les résultats de la fenêtre output, la page imprimée est différente de celle visualisée. Réponse
- Comment mettre à jour une table existante par rapport à une autre table, tout en conservant les indexes ? Réponse nouveau
- Réparer toutes les tables d'une bibliothèque Réponse nouveau
 |
REPONSES
Comment utiliser la macro-variable SYSDATE ?
La macro-variable SYSDATE renvoie la date système courante en utilisant
le format DATE7.
La date système "January 5, 2000" sera donc codée "05JAN00".
Exemple :
data _null_ ;
date = input("&sysdate",date7.) ;
put date ddmmyy8. ;
run ;
Résultat : 05/01/00
Avec le passage à l'an 2000, lorsque l'option YEARCUTOFF n'est pas positionnée,
cela peut engendrer des problèmes si des tests sont réalisées par rapport
à cette date.
En effet, sans le positionnement de YEARCUTOFF, la valeur de l'exemple
précédent sera interprétée comme la date 05/01/1900.
Pour que la valeur renvoyée par SYSDATE soit interprétée correctement,
il suffit de positionner l'option YEARCUTOFF à une valeur qui vous convient.
Exemple :
options yearcutoff = 1920 ;
data _null_ ;
date = input("&sysdate",date7.) ;
put date ddmmyy10. ;
run ;
Résultat : 05/01/2000
A partir des versions 6.12 TS060 et 6.09E TS470, vous pouvez aussi utiliser
la macro-variable SYSDATE9 qui retourne l'année sur quatre digits.

 |
Comment lire un fichier de données de type texte
contenu dans un fichier de type ZIP ?
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 :
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.

Comment calculer les numéros de semaine ?
*-- Ce programme calcule le numéro de semaine de la date courante, sachant
qu'une semaine commence le dimanche (norme US)-- ;
data _null_;
madate=today();
week=intck('week',intnx('year',madate,0),madate);
put week=;
run;
*-- Et ici la semaine commence le lundi -- ;
data jour_sem;
length date semaine 3.;
label date="Date"
semaine = "N° de semaine";
format date date7.;
date=today();
semaine=-1;
cpt=0;
do until (semaine>0);
semaine=int((7*int((date+3156192)/7)+10 - mdy(1,1,year(date)+1 - cpt)
- 3156192)/7);
cpt+1;
end;
drop cpt;
output;
put semaine= ;
run;

 |
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
?
1/ Pour pouvoir lire ces tables en version 8 , il faut créer une bibliothèque
particulière avec l'option SHORTFILEEXT .
Exemple :
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 :
libname mylib 'c:\mysasdata' shortfileext;
libname mylibfinal 'c:\newdata';
proc copy in=mylib out=mylibfinal;
run;

Comment lire un fichier hébergé
par un serveur internet ou intranet à l'aide d'une instruction
FILENAME en version 8 ?
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 :
// 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'information sur la lecture
du fichier et n'est pas indispensable.
Exemple :
filename web url 'http://www.addresse/vers/ma/page.html'
proxy='http://proxy2.eur.sas.com.:3128/' debug ;

Comment supprimer l'affichage des numéros
de pages dans l'output ?
Il suffit de paramétrer l'option NUMBER à zéro :
Options number=0 ;
Remarque : pour obtenir à nouveau les numéros de pages,
il faut paramétrer cette option à un.

Comment faire pour convertir une variable
numérique en variable caractère, et inversement ?
Vous devez utiliser respectivement les fonctions PUT et INPUT. L’exemple
suivant illustre ceci : /*num est de type numérique,
car est de type caractère*/
data origine;
input num car $;
datalines;
12 34
;
run;
data finale;
set origine;
/*passage de variable numérique en variable caractère*/
numTOcar=put(num,2.);
/*passage de variable caractère en variable numérique*/
carTOnum=input(car,2.);
run;
proc contents data=finale;
run; La sortie ainsi obtenue est la suivante :


Comment remplacer toutes les valeurs
manquantes d'une table par 0 ?
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 macro-programme ci-dessous prend en paramètre le nom de la
table SAS en entrée.
%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 ;
Pour en savoir plus sur l’utilisation de l’ARRAY, vous pouvez
consulter
« Allô support » n°13.

Comment procéder pour
que plusieurs utilisateurs puissent accéder de façon simultanée
à un catalogue de macro procédures compilées ?
En ajoutant l'option access=readonly au niveau de la définition
de la bibliothèque où est stocké le catalogue SASMACR

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 ?
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

Comment exporter chaque table
d’une bibliothèque dans un classeur Excel ?
Le macro-programme ci-dessous exporte chaque membre de type DATA d’une
bibliothèque.
Liste des paramètres :
· MYLIB : Nom de la bibliothèque où sont stockées
les tables SAS
· MYDIR : Nom du répertoire où seront stockés
les fichiers MS Excel.
%MACRO M_EXPORT (MyLib=, MyDir=);
data _null_ ;
set sashelp.vtable (where=(libname=compress(upcase("&MyLib"))))
;
call execute
("PROC EXPORT
DATA=" !! compress(libname !! '.' !!memname)
!!
" OUTFILE='&MyDir" !! compress(memname !! ".XLS'")
!!
" DBMS=EXCEL2000 REPLACE ; RUN ;") ;
run ;
%MEND M_EXPORT; Pour plus d’informations sur la routine
EXECUTE, vous pouvez consulter “Allô
support" n° 14.
Pour exporter des données vers Excel avec la procédure
EXPORT, il est nécessaire d’avoir une licence pour le module
SAS/Access to PC File Formats.

Quelle est la limite d’une
table 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.

Comment utiliser les variables
d’environnement système dans un programme SAS ?
La fonction "SYSGET" permet de récupérer le contenu
d’une variable d’environnement Système. Voici un exemple
où l’on récupère le nom de l’utilisateur
(variable Windows "USERNAME") dans une variable SAS.
data _null_;
length MONUSER $50;
MONUSER=sysget(trim("USERNAME"));
put MONUSER=;
run;
Le principe est le même pour les variables Unix:
MAVARIABLE=sysget(trim("$HOME"));

Comment vérifier l’état
de la base de registre SAS ?
La procédure REGISTRY permet de valider l’état de
la base de registre SAS:
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

(SAS 9) Où puis je voir
la documentation en ligne SAS9 ?
La documentation en ligne est accessible sur notre site à l’adresse
suivante:
http://v9doc.sas.com/sasdoc/
(SAS 9) Peut-on
avoir plusieurs serveurs de Méta-données SAS 9 sur la même
machine ?
Oui, pour cela il est nécessaire d’utiliser différents
ports pour chaque serveur de méta-données.
(SAS 9) Comment crypter un mot
de passe utilisateur depuis 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 de
SAS disponible avec SAS 9.1.
PROC PWENCODE in="your-pw";
RUN ;

Comment conserver
les dix meilleurs résultats (top ten) obtenus par groupe ?
L'idée est de créer un compteur, par groupe, et de ne garder
que les valeurs inférieures ou égales à dix.
Prenons un exemple : comment conserver les dix meilleures ventes de chaque
pays, dans la table sashelp.prdsale ?
/* Tri de la table, par pays et valeur décroissante des
ventes */
proc sort data = sashelp.prdsale out=prdsale_tri;
by country descending actual;
run;/*
Création du compteur, réinitialisé à chaque
nouveau groupe et extraction des dix premières valeurs de ce compteur,
pour chaque groupe */
data top_ten(drop=cpt);
retain cpt 0;
set prdsale_tri;
by country;
cpt=cpt+1;
if first.country then cpt=1;
if cpt <=10 then output; run; 
(SAS 9) Comment récupérer des informations relatives
au JRE (Java Runtime Environment) associé à SAS Foundation
?
Il existe la procédure JAVAINFO.
Si vous exécutez le code suivant, la procédure écrira
dans la log les informations relatives au JRE utilisé. proc
javainfo;
run; 
Comment extraire une date/heure
d’une variable datetime ?
Pour récupérer la date, il suffit d’utiliser la
fonction du module Base SAS : DATEPART.
Pour récupérer l’heure, il suffit d’utiliser
la fonction du module Base SAS : TIMEPART.
data _null_;
variable = '30JUL1970:20:30:00'dt;
date = datepart(variable);
heure = timepart(variable);
put "la date est " date ddmmyy10.;
put "l'heure est " heure time5.;
run; Le journal (log) indique :
la date est 30/07/1970
l'heure est 20:30

Comment diminuer le contenu
de la log SAS ?
Différentes options SAS permettent d’alléger la log
SAS. Voici les principales:
- L’option "nonotes" permet de supprimer les notes SAS
dans la log. Les messages d’alertes (Warning) et les erreurs seront
toujours visibles.
- L’option "nosource" permet de ne pas afficher dans la
log le code exécuté.
- L’option "noechoauto" permet de ne pas afficher dans
la log le résultat de l’exécution d’un fichier
autoexec.sas.

Comment vider la log depuis
la fenêtre "Program Editor" ?
La commande suivante permet d’effacer le contenu de la log SAS :
dm log 'clear' editor; 
Comment exécuter une
étape data sans l’afficher dans la log ?
Cet exemple permet d’exécuter des étapes data sans
afficher leur déroulement dans la log SAS.
data sample;
input code 3. ;
cards;
1
1
2
;
run;
/* répertoire de stockage du programme */
libname stored 'C:\temp\stored';
/* le code suivant sera sauvegardé dans la bibliothèque STORED
et aura pour nom SAMPLE */
data sample2 / pgm=stored.sample;
set sample;
if code = 1 then
do;
Type='Perennial';
number+4;
end;
run;
/* Ensuite, pour exécuter ce programme, sans faire apparaître
le code dans la log, vous pouvez exécuter le code suivant : */
data pgm=stored.sample;
execute;
run;
La log ainsi générée sera la suivante :
216 data pgm=stored.sample;
217 execute;
218 run; 
Comment à partir d'une
table sas contenant les adresses emails et des chemins de fichiers, peut-on
envoyer plusieurs fichiers en pièces jointes d'un mail avec SAS 8.2 ?
Voici un exemple de code SAS permettant de transmettre plusieurs fichiers
par messagerie.
La table "mail" contient les adresses ainsi que les chemins
des fichiers à transmettre.
data mail;
input adress $18. file $20. file2 $20.;
cards;
nom@adress.com "c:\tests\data.sas" "c:\tests\axis.sas"
nom1@adress1.com "c:\tests\data.sas" "c:\tests\axis.sas"
nom2@adress2.com "c:\tests\data.sas" "c:\tests\axis.sas"
nom3@adress3.com "c:\tests\data.sas" "c:\tests\axis.sas"
;
run;
filename reports email "nom@adress.com";
data _null_ ;
file reports;
length adress $ 30 file $ 21;
set mail;
put '!EM_TO!' adress;
put '!EM_SUBJECT! Report for ' file;
put adress ',';
put 'Report for ' file file2 '.';
put '!EM_ATTACH! ('file' 'file2') ';
put '!EM_SEND!';
put '!EM_NEWMSG!';
put '!EM_ABORT!';
run;

Comment interpréter
les tests en sortie de la procédure UNIVARIATE ?
Dans le paragraphe « Statistical computation » section «
Goodness-of-Fit Tests », de la documentation de la procédure
UNIVARIATE de la version 8 (p1396 / 1397), une erreur d’interprétation
des tests apparaît.
Le paragraphe suivant :
« When the p-value is less than the predetermined critical value
(alpha value), you reject the null hypothesis and conclude that the data
came from the theorical distribution…”
est à modifier comme ceci :
« When the p-value is less than the predetermined critical value
(alpha value), you reject the null hypothesis and conclude that the data
DO NOT come from the theorical distribution…”
Ce qui signifie que, en posant les hypothèses suivantes pour un
test de normalité :
H0 : les données suivent une loi normale
H1 : les données ne suivent pas la loi normale
- Si la p-value<a, alors on rejette l’hypothèse nulle
c'est-à-dire l’hypothèse que les données ne
suivent pas une loi normale.
- Si la p-value> a, alors on ne peut pas refuser l’hypothèse
que les données suivent une loi normale.
Voir
la SN-006977

(SAS9) Comment forcer l’importation
des dates de fichiers Excel en format « datetime.» ?
Utiliser la fonction USEDATE= NO, comme dans l’exemple ci-dessous
: proc import out=matable datafile='c:\fichierExcel.xls';
usedate=no;
run ; Remarques :
- Par défaut, USEDATE=YES : les dates seront importées en
format « date9. ».
- USEDATE=NO : les dates seront importées, comme en version 8.2,
à savoir en format « datetime. ».

Est-il possible de modifier
le nombre de lignes maximum écrites dans les fenêtres Log
et Output ? Ceci afin d’éviter l’ouverture d’une
fenêtre indiquant « Window Full ».
En SAS 9, les options DMSOUTSIZE (pour l’output) et DMSLOGSIZE
(pour la log) permettent de modifier le nombre de lignes affichées
avec un minimum de 500 lignes et un maximum de 999999 lignes. Leur valeur
par défaut est 99999 lignes.
Ces options sont positionnables dans le fichier de configuration de SAS
ou à l’invocation de SAS.

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
?
Vous pouvez utiliser cette syntaxe :
Put var1 +(-1) var2;
Exemple : 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

Comment générer
une variable numérique ou caractère de manière aléatoire
?
- Pour générer un numérique aléatoire,
vous pouvez utiliser la fonction RANUNI.
Exemples :
Length var1 $ 10 ;
Var1=ranuni(0) ;
Var1=20*ranuni(0) ;
Var1=ceil (32*ranuni(0)) ;
- Pour générer une variable caractère
contenant des chiffres et des lettres, vous pouvez utiliser ce
programme :
Length var1 $ 10 ;
do j=1 to 10;
var1=compress(var1)||trim(scan('A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S,T,U,V,W,X,Y,Z,0,1,2,3,4,5,6,7,8,9',
ceil(36*ranuni(0))));
end;
- Pour générer une variable caractère
contenant des lettres, vous pouvez utiliser le programme ci-dessus,
en ne gardant que l’alphabet dans la première partie de la
fonction SCAN, comme ceci :
Length var1 $ 10 ;
do j=1 to 10;
var1=compress(var1)||trim(scan('A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S,T,U,V,W,X,Y,Z',
ceil(26*ranuni(0))));
end;

Comment créer un format
pour afficher la date ou un datetime au format dd/mm/yyyy ?
Vous devez exécuter une Proc Format avec une instruction Picture
suivie de l’option datatype=date ou datetime.
L’ajout de caractères spéciaux dans le type de format
permet ensuite de définir l’affichage souhaité avec
le jour, le mois et l’année.
Exemple :
proc format;
picture ddmmyyyy other='%0d/%0m/%0Y' (datatype=date);
picture dtddmmyyyy other='%0d/%0m/%0Y' (datatype=datetime);
run; data _null_;
dt='18dec2005 12:34:56'dt;
put dt dtddmmyyyy.;
d='14feb2005'd;
put d ddmmyyyy.;
run;
Résultat dans la fenêtre journal : 18/12/2005
14/02/2005

Comment importer des données
d'un fichier texte dans SAS en conservant les variables caractères à points
?
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 :
A partir du fichier présent dans C:\FAQ.txt contenant les données
suivantes :
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;

Comment récupérer le nombre d’observations d’une
table dans une macro variable ?
Pour récupérer le nombre d’observation, il faut utiliser
l’option NOBS dans l’instruction SET.
Pour créer une macro variable, il faut utiliser la fonction CALL
SYMPUT.
options symbolgen ;
data _null_;
set sashelp.class nobs=nobs ;
call symput ("nbobs",nobs);
run;
%put "Le nombre d'observations de la table est:" &nbobs ;

Comment obtenir la liste des formats présents dans une bibliothèque
?
Il faut utiliser la procédure CATALOG.
Si on veut en plus obtenir les modalités de chacun des formats, il
faut utiliser la procédure FORMAT combinée à l’option
FMTLIB.
Exemple :
Libname FAQ 'C:\';
proc format library=FAQ.Formats;
value $essai
"O" ="oui"
"N" ="non";
run;
/* Pour avoir les noms des formats présents dans la bibliothèque
FAQ */
proc catalog cat=FAQ.formats;
contents;
quit;
run;
/* Pour voir plus en détails les modalités de chaque format
de la bibliothèque*/
Proc format lib=FAQ fmtlib;
run;

Comment créer un alias pour
le moteur SASIOIME ?
Par défaut le moteur permettant de lire une information map porte
le nom de SASIOIME. Afin de simplifier le nom pour son utilisation, un alias
INFOMAPS peut être créé en utilisant la procédure
NICKNAME comme ci-dessous :
proc nickname cat=sashelp.core;
add nickname=infomaps
module=sasioime
desc = "Information Maps LIBNAME engine"
prefered
engine;
run;
quit;
Attention : afin de pouvoir créer un alias sur le moteur sasioime
il est indispensable de disposer des droits d’écriture sur
la bibliothèque SASHELP. Dans le cas contraire, le message d’avertissement
suivant apparaitra dans le journal.
WARNING: Catalog could not be opened for UPDATE. BROWSE mode assumed

Dans une chaîne de caractères, comment mettre la première lettre de chaque mot en majuscule et les autres lettres en minuscule ?
Il faut utiliser la fonction PROPCASE.
Example :
Data Faq ;
X= 'ALLO SUPPORT ';
Y=propcase(X);
Put X= Y= ;
Run;
Résultat :
X=ALLO SUPPORT
Y=Allo Support

Comment mettre à jour un programme ouvert et modifié par plusieurs personnes en même temps ?
L’option EEFILECHANGEUPDATES a été ajoutée en SAS9 pour retrouver le même comportement qu'en SAS 8.2.
Il faut ajouter ces lignes dans le fichier de configuration:
/* SAS program file (*.sas) opened simultaneously in the Enhanced Editor are reflected in the Enhanced Editor after saving.*/
-EEFILECHANGEUPDATES
Par défaut, le fichier de configuration est C:\Program Files\SAS\SAS 9.1\nls\fr\SASV9.CFG si vous avez installé SAS en français, ou bien C:\Program Files\SAS\SAS 9.1\nls\fr\SASV9.CFG pour une installation en anglais. Si vous avez choisi plusieurs langues pendant l’installation, il est recommandé de modifier chaque fichier de configuration pour chaque langue.

Comment supprimer un format par programme SAS ?
Pour un format numérique :
proc catalog cat=work.formats;
delete NomDuFormat/et=FORMAT;
run; quit ;
Pour un format alphanumérique :
proc catalog cat=work.formats;
delete NomDuFormat/et=FORMATC;
run; quit ;

Comment créer une table SAS à partir de plusieurs fichiers texte, stocké dans un même répertoire, en commençant la lecture des observations sur la Nième ligne ?
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 2ème ligne. Tous les fichiers ont la même structure.
%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;

Depuis SAS, comment envoyer un email en insérant du texte formaté dans le corps du message ?
L’utilisation d’un Filename Email permet d’envoyer un email depuis SAS.
Pour formater du texte directement dans le corps du message, il faut utiliser l’instruction PUT combinée à l’instruction Style (alias S) et ses options associées.
Le programme ci-dessous, permet de mettre des caractères en gras, en italique, d’augmenter la taille de la police et également de modifier la couleur :
FILENAME M EMAIL TO=destinataire@fra.sas.com
FROM="expediteur@fra.sas.com"
SUBJECT="TEST EMAIL FORMATE" TYPE="TEXT/HTML" CONTENT_TYPE="TEXT/HTML" ;
ODS LISTING CLOSE;
ODS HTML BODY=M STYLE=STYLES.DEFAULT RS=NONE ;
ODS ESCAPECHAR='*'; DATA _NULL_; FILE PRINT; PUT 'CE TEXTE EST EN *S={FONT_WEIGHT=BOLD}GRAS*S={}' ; PUT 'ET CELUI-CI EST EN *S={FONT_STYLE=ITALIC}italique*S={}.'; PUT 'CELUI-CI EST *S={FONT_SIZE=14}GRAND*S={} ET CELUI-CI NON'; PUT '*S={FOREGROUND=RED}LA COULEUR *S={} PEUT AUSSI ETRE MODIFIEE.'; RUN;
ODS HTML CLOSE;
ODS LISTING;
FILENAME M ;
Attention de ne pas oublier L’instruction ODS ESCAPECHAR, pour que le caractère ‘*’ soit bien reconnu dans les instructions PUT.
En SAS9, comment extraire la position d’un mot d’une chaîne de caractère sans être sensible à la casse ?
Il faut utiliser la fonction FIND avec l’option ‘i’.
La fonction FIND cherche la première occurrence du mot spécifié en paramètre et retourne sa position.
L’exemple ci dessous compare les résultats obtenus avec la fonction FIND et la fonction INDEX (présente en V8). La fonction index étant elle sensible à la casse.
Example:
data _null_;
A=find('où se trouve le mot recherche','TROUVE','i');
put A=;
B=index('où se trouve le mot recherche','TROUVE');
put B=;
run;
Résultats:
A=7
B=0
L’aide en ligne du tagset ExcelXP pour PRINT_HEADER ne donne pas toujours la bonne syntaxe.
Les lettres à utiliser dépendent du pack Office utilisé. Lorsque le résultat obtenu n’est pas celui escompté, vous pouvez faire des tests dans Excel pour connaître la bonne syntaxe :
- depuis Excel, créer un en-tête et un pied de page tel que vous les souhaitez
- enregistrer le fichier en ‘Feuille de calcul XML (*.xml)’
- l'éditer dans un éditeur de texte
- rechercher les mots "header" et/ou "footer"
La chaîne de caractère vous permettra de déduire les lettres à utiliser pour placer ou mettre en forme le texte souhaité.
Le tableau suivant récapitule les lettres à utiliser (cette liste n’est pas exhaustive) :
& ;L ou & ;E |
Partie gauche |
& ;C |
Partie centrale |
& ;R |
Partie droite |
ou 
 ; |
Saut de ligne |
&P |
N° de la page |
&N ou &T |
Nombre total de pages |
&D ou &J |
Date du jour |
&T ou &H |
Heure actuelle |
&Z |
Chemin du fichier |
&F ou &N |
Nom du fichier |
&A |
Nom de la feuille |
&U ou & ;S ou & ;L (double ligne) |
Texte souligné |
&8 |
Taille de la police |
Exemple d’utilisation :
ods listing close ;
ods tagsets.excelXP /* options(doc='help')*/ file="!temp\class.xls" ;
ods tagsets.excelXP
options(
embedded_titles='yes'
Embedded_Footnotes='yes'
Print_Header='&E Récapitulatif &C&J &D Pages &P sur &T'
Print_Footer='&E&N'
);
proc print data=sashelp.class ;
run;
ods tagsets.excelXP close;

Comment savoir si l’exécution d’un programme est terminée ?
Un moyen simple pour savoir si l’exécution d’un programme est finie, consiste à émettre un son à l’aide de la routine SOUND lorsque l’exécution du programme se termine.
Le code suivant est à mettre à la fin du programme :
data _null_;
call sound(400,200);
run;
La première valeur représente la fréquence (Hertz) et la deuxième valeur la durée en millisecondes.

Caractéristiques
: |
 |
 |
- Catégories : SAS/Base
- OS : all
- Version : all
- Vérifié le 09/11/2007
|
 |
 |
Lorsque j’imprime les résultats de la fenêtre output, la page imprimée est différente de celle visualisée.
Il faut vérifier que la police d’affichage est la même que la police d’impression.
- Pour l’impression aller dans le menu fichier >> Définir impression… >> Police…
- Pour l’affichage aller dans le menu Outils >> Options >> Police…
De préférence, sélectionnez SAS Monospace.

Caractéristiques
: |
 |
 |
- Catégories : SAS/Base
- OS : Unix, Windows, z/Os
- Version : SAS® 9.1.3
- Vérifié en 09/2008
|
 |
 |
Comment mettre à jour une table existante par rapport à une autre table, tout en conservant les indexes ?
Voici un exemple pour effectuer la mise à jour d’une table maitresse avec une autre table en gardant les indexes.
-----------------------------------------------
/* La table maitresse. */
data BIG ;
X = 1 ; Y = 'A' ; output ;
X = 2 ; Y = 'B' ; output ;
X = 3 ; Y = 'C' ; output ;
run ;
/*Creation l’index */
proc datasets lib=work nolist ;
modify BIG ;
index create X ;
quit ;
/* Depuis la table SMALL,
L’observation avec X=3 doit être mise à jour,
celle avec X=999 est une nouvelle observation */
data SMALL ;
X = 3 ; Y = 'Z' ; output ;
X = 999 ; Y = 'Z' ; output ;
run ;
/*Creation l’index */
proc datasets lib=work nolist ;
modify SMALL ;
index create X ;
quit ;
/* Mise à jour de la table "maitre". l'index est conservé... */
data BIG;
set SMALL(rename=(Y=tY));
by X;
modify BIG key=X;
if _iorc_=%sysrc(_sok) then do;
Y=tY;
_error_=0;
put 'in replace';
replace BIG;
end;
else if (%sysrc(_dsenom)) then do;
_error_=0;
Y=tY;
put 'in insert';
output BIG;
end;
run;
-----------------------------------------------
Aide en ligne :
http://support.sas.com/kb/25/453.html
http://www2.sas.com/proceedings/sugi30/008-30.pdf
http://support.sas.com/techsup/technote/ts250.html#

Caractéristiques
: |
 |
 |
- Catégories : SAS/Base
- OS : Unix, Windows
- Version : SAS® 9.1.3,
SAS® 8
- Vérifié en 09/2008
|
 |
 |
Réparer toutes les tables d'une bibliothèque
Voici un exemple de code qui permet de réparer toutes les tables contenues dans la bibliothèque MYLIB.
-----------------------------------------------
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;
quit;
-----------------------------------------------

|