SAS

Les logiciels et les services qui vous donnent le pouvoir de savoir

ActualitéEvènementsSupport ClientsFormationAcademicEmploisContact
Accueil Produits et Solutions références Partenaires Services La Société www.sas.com
 
Support Clients
Fonctionnement
Assistance personnalisée
Contacter le Support
FAQ
Newsletter SAS France
Documents techniques
Ressources en ligne
Correctifs
 

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.

Retour Haut

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.

Retour Haut


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;


Retour Haut


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;



Retour Haut



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 ;


Retour Haut


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.


Retour Haut



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 :


 


Retour Haut

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.

 


Retour Haut


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

 


Retour Haut

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

 


Retour Haut

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.


Retour Haut

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.

 


Retour Haut

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"));

 


Retour Haut

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


Retour Haut

(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/


Retour Haut

(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.


Retour Haut

(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 ;


Retour Haut

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;

Retour Haut

(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;

Retour Haut

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

Retour Haut

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.

Retour Haut

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;

Retour Haut

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;

Retour Haut

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;

 

Retour Haut

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

Retour Haut

(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. ».

Retour Haut

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.

Retour Haut

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

Retour Haut

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;

Retour Haut

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

Retour Haut

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;

Retour Haut

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 ;

Retour Haut

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;

Retour Haut

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

Retour Haut

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

Retour Haut

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.

Retour Haut

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 ;

Retour Haut

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;

Retour Haut

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.

Retour Haut

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

Retour Haut

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 :

  1. depuis Excel, créer un en-tête et un pied de page tel que vous les souhaitez
  2. enregistrer le fichier en ‘Feuille de calcul XML (*.xml)’
  3. l'éditer dans un éditeur de texte
  4. 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) :

&amp ;L ou &amp ;E

Partie gauche

&amp ;C

Partie centrale

&amp ;R

Partie droite

&#13; ou &#10 ;

Saut de ligne

&amp;P

N° de la page

&amp;N ou &amp;T

Nombre total de pages

&amp;D ou &amp;J

Date du jour

&amp;T ou &amp;H

Heure actuelle

&amp;Z

Chemin du fichier

&amp;F ou &amp;N

Nom du fichier

&amp;A

Nom de la feuille

&amp;U ou &amp ;S ou &amp ;L (double ligne)

Texte souligné

&amp;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='&amp;E Récapitulatif &amp;C&amp;J &amp;D Pages &amp;P sur &amp;T' 

  Print_Footer='&amp;E&amp;N'

);

 

proc print data=sashelp.class  ;

run;

 

ods tagsets.excelXP close;

Retour Haut

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.

Retour Haut

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.

Retour Haut

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#

Retour Haut

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;

-----------------------------------------------

 

Retour Haut

Customer Support Center
Correctifs
SAS notes
Documentation
Install Center
Forums de discussion
Demandes d’améliorations

Contactez-nous

Le support est accessible du lundi au vendredi de 9h00 à 17h30 (17h00 le vendredi).

• par e-mail : support@sas.com
• par téléphone : 01 60 62 12 12

Pour toute remarque sur le support : tcsfaq@fra.sas.com
The Power to Know
 Recherche   Données Personnelles   Mentions légales   Privacy Statement   Copyright 2008 SAS Institute Inc. All Rights Reserved