IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)

FAQ SASConsultez toutes les FAQ

Nombre d'auteurs : 14, nombre de questions : 232, dernière mise à jour : 20 décembre 2012 

 
OuvrirSommaireSAS BASEGestion de bases de données

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 :

 
Sélectionnez

DATA equipe; 
INPUT nom$ anneecreation nbjoueur;
CARDS;
sharks 1950 12
tigers 1951 33
lions 2000 42
zodiac 2006 11
flyers 2007 42
;
RUN;

L'étape DATA nous permet de créer un tableau appelé equipe.
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.

Créé le 1er mars 2008  par Fleur Anne Blain

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 :

 
Sélectionnez

DATA equipe;
INFILE "coatch.txt";
INPUT nom$ anneecreation nbjoueur;
RUN;
PROC PRINT DATA=equipe;
RUN;

INFILE permet donc de lire des fichiers plats suivis entre " " de leur nom.

Créé le 1er mars 2008  par Fleur Anne Blain

Et si notre nom d'équipe était en deux parties (séparées par un espace) ? Pour SAS un espace correspond à la valeur suivante :

 
Sélectionnez

DATA equipe;
INFILE "coatch.txt";
INPUT nom$ 1-10 anneecreation 13-16 nbjoueur;
RUN;
PROC PRINT DATA=equipe;
RUN;

Ce que nous venons d'ajouter signifie que les données de la variable nom peuvent être sur 10 caractères maximum, que l'année de création de l'équipe est sur 4 caractères.

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.

Créé le 1er mars 2008  par Fleur Anne Blain

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

 
Sélectionnez

PROC SQL;
SELECT * FROM base;
QUIT;
Créé le 1er mars 2008  par fafabzh6

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 :

 
Sélectionnez

DATA equipe; 
INPUT nom$ :20. anneecreation nbjoueur;
CARDS;
sharks 1950 12
tigers 1951 33
lions 2000 42
zodiac 2006 11
flyers 2007 42
;
RUN;

Dans cet exemple, nous avons spécifié une taille pour la variable nom. Un nom d'équipe disposera de 20 caractères maximum à l'affichage. Pour cela, il est impératif de mettre "nb" après la variable en question dans la section INPUT de votre programme. Bien entendu, "nb" est à remplacer par n'importe quelle valeur entière.

Créé le 1er mars 2008  par Fleur Anne Blain

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 :

 
Sélectionnez

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;

Toutes les données sont sur une unique ligne. Cependant, à l'exécution de notre programme SAS il n'a été pris en compte que ceci :

 
Sélectionnez

Obs nom anneecreation nbjoueur
1 sharks 1950 12

Donc même si toutes les données sont sur une seule ligne tout n'est pas pris en compte. Pour lire des données saisies sur une ligne unique il suffit d'ajouter l'instruction @@ dans la section INPUT de votre programme comme suit :

 
Sélectionnez

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;

Et nous obtenons bien le résultat voulu :

 
Sélectionnez

Obs nom anneecreation nbjoueur
 
1 sharks 1950 12
2 tigers 1951 33
3 lions 2000 42
4 zodiac 2006 11
5 flyers 2007 42
Créé le 1er mars 2008  par Fleur Anne Blain

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.

 
Sélectionnez

DATA tab_boucles;
DO i=0 TO 10 BY 1;
v= i*10;
OUTPUT tab_boucles;
END;
RUN;

Pour réaliser une boucle, il y a quatre mots-clés :

* DO
* TO
* BY
* END

Créé le 16 mars 2008  par Fleur Anne Blain

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 :

 
Sélectionnez

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;

Le code suivant affiche les deux premières lignes de cette table :

 
Sélectionnez

PROC PRINT DATA=base LABEL;
WHERE v2 LE 2;
RUN;
Créé le 27 mai 2008  par rastoix
 
Sélectionnez

DATA t1;
input t t12 t13;
cards;
1 2 1
3 5 6
5 6 7
8 9 3
4 5 3
;
run;
 
DATA t2;
input t t2;
cards;
1 2
3 5
7 8
2 3
4 5
;
run;
 
proc sort DATA=t1 ; BY t ;run;
proc sort DATA=t2 ; BY t ;run;
DATA res; merge t1(IN=a) t2(IN=b);
BY t;
IF a AND b then var=1;
else var=0;
DROP t2;
run;
Créé le 27 mai 2008  par bahraoui

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.

Créé le 27 mai 2008  par bahraoui

Les tables doivent avoir la même structure.

 
Sélectionnez

DATA fusion;
SET table_1 table_2... table_n; 
run;
Créé le 27 mai 2008  par bahraoui

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 :

 
Sélectionnez

DATA VIDE;
SET _NULL_;
length a 3;
run;

Ou comme suit :

 
Sélectionnez

DATA vide; length a 3.; stop;
run;

Et pour le SQL :

 
Sélectionnez

proc sql;
CREATE TABLE tab  (a int);
quit;
Créé le 10 octobre 2008  par fafabzh6

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" :

 
Sélectionnez

DATA base;
INPUT var1 var2;
CARDS;
10 5 
3 8
;
DATA base2;
SET base;
RENAME var1=variable1;
RENAME var2=v2;
RUN;
 

La table "base" contient deux variables : les variables "var1" et "var2". Grâce à l'option "RENAME", nous avons renommé la variable "var1" en "variable1" et la variable "var2" en "v2".

Mis à jour le 10 novembre 2011  par fafabzh6

Pour changer le nom d'une table SAS vous devez utiliser la procédure DATASETS avec l'option CHANGE comme suit :

 
Sélectionnez

PROC SQL;
CREATE TABLE tab  (a int);
QUIT;
 
PROC datasets lib=work;
CHANGE tab=tab_new;
run;
quit;
Créé le 10 octobre 2008  par fafabzh6

Pour dupliquer une ligne particulière d'une table SAS vous pouvez utiliser l'option OUTPUT dans une étape DATA.

 
Sélectionnez

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;
Créé le 10 octobre 2008  par fafabzh6

Dans une étape DATA, vous pouvez à l'aide de l'option RETAIN changer l'ordre d'impression des variables (ou colonnes) d'une table.

 
Sélectionnez

DATA base;
INPUT v1 v2;
CARDS;
1 2
10 3
;
RUN;
DATA base;
RETAIN v2 v1;
SET base;
RUN;
PROC PRINT DATA=base2;
RUN;
Créé le 10 octobre 2008  par fafabzh6

Pour rajouter un identifiant de type numéro automatique vous pouvez utiliser la fonction _N_ dans une étape DATA.

 
Sélectionnez

DATA base;
INPUT v1 v2;
CARDS;
9 5
10 3
;
RUN;
DATA base2;
SET base;
id=_N_;
RUN;
Créé le 10 octobre 2008  par fafabzh6

La fonction UTILITY vous permet de faire ce genre de manipulation.

 
Sélectionnez

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;
Créé le 10 octobre 2008  par oncle_pete

La fonction LAG vous permet de faire ce genre de manipulation.

 
Sélectionnez

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;
 
            

Résultat de la log

 
Sélectionnez

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 

Contenu du Dataset One

 
Sélectionnez

X Y
3 .
5 3
. 5
6 .
1 6
4 1 
Créé le 10 octobre 2008  par 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.
Créé le 10 octobre 2008  par green_fr

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 :

 
Sélectionnez

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 ;

UTF8 car l'option placée au démarrage de SAS modifie automatiquement tous les encoding à UTF8. WLATIN2 : pour les caractères de l'Europe centrale (Pologne, Croatie, etc.). Pour les caractères français, l'encoding est WLATIN1.

Créé le 11 décembre 2009  par SAS

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 :

 
Sélectionnez

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;
            

Pour un tri décroissant de ce même programme, il suffit de remplacer la PROC SORT par ceci :

 
Sélectionnez

PROC SORT DATA=equipe OUT=equipe_triee;          
BY DESCENDING nom anneecreation nbjoueur;
RUN;

Attention ce tri ne sera décroissant que pour la variable nom, les autres resteront par défaut croissants.

Créé le 16 mars 2008  par Fleur Anne Blain

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

 
Sélectionnez

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; 
Créé le 7 novembre 2011  par 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.

Créé le 10 octobre 2008  par SAS

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 ?

 
Sélectionnez

/* 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;
Créé le 10 octobre 2008  par SAS
 
Sélectionnez

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*/
Créé le 27 mai 2008  par bahraoui

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

 
Sélectionnez

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
Créé le 10 octobre 2008  par SAS

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

Créé le 10 octobre 2008  par SAS

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

 
Sélectionnez

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.

Créé le 1er mars 2008  par steelspirit
 
Sélectionnez

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.

Créé le 1er mars 2008  par Fleur Anne Blain

Il suffit d'ajouter ce bout de code à votre programme SAS

 
Sélectionnez

PROC CONTENTS;
RUN;

PROC CONTENTS est une procédure SAS qui permet d'obtenir le nombre d'observations (ou de lignes), le nombre de variables, le nom de la table ou encore la date de création.

Créé le 1er mars 2008  par Fleur Anne Blain
 
Sélectionnez

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;
Créé le 27 mai 2008  par bahraoui

Suppression de toutes les tables de l'espace work :

 
Sélectionnez

proc datasets lib=work KILL;
run;
quit;

Suppression de la table T1 de l'espace work :

 
Sélectionnez

proc datasets lib=work ;
DELETE t1;
run;
quit;
Créé le 27 mai 2008  par bahraoui
 
Sélectionnez

/***************************************/
/* 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;            
Créé le 10 octobre 2008  par oncle_pete

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 :

 
Sélectionnez

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.
Créé le 10 octobre 2008  par SAS

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 :

 
Sélectionnez

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

 
Sélectionnez

filename web url 'http://www.addresse/vers/ma/page.html'
proxy='http://proxy2.eur.sas.com.:3128/' debug ;
Créé le 10 octobre 2008  par SAS

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

 
Sélectionnez

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 :

 
Sélectionnez

libname mylib 'c:\mysasdata' shortfileext;
libname mylibfinal 'c:\newdata';
 
proc copy in=mylib out=mylibfinal;
run; 
Créé le 10 octobre 2008  par SAS

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.

 
Sélectionnez

%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 ;
Créé le 10 octobre 2008  par 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.

 
Sélectionnez

%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; 
Créé le 10 octobre 2008  par SAS

Par défaut, lorsque le même programme est ouvert et modifié simultanément via plusieurs applications par une ou plusieurs personnes, le .sas physique est écrasé dès qu'il est sauvé depuis n'importe laquelle des applications. Chacun travaille sur son programme, sans savoir que le programme a pu être modifié. L'option EEFILECHANGEUPDATES permet d'être alerté lorsque le programme ouvert dans la session SAS en cours a été modifié.

Cette option s'ajoute dans votre fichier de configuration C:\Program Files\SAS\SASFoundation\9.2\SASV9.cfg (ou bien l'un des fichiers se trouvant sous le dossier NLS): EEFILECHANGEUPDATES.

Mis à jour le 15 novembre 2011  par SAS

Vous pouvez utiliser cette syntaxe :

 
Sélectionnez

Put var1 +(-1) var2;

Exemple :

 
Sélectionnez

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.

Créé le 10 octobre 2008  par SAS

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 :

 
Sélectionnez

           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; 
Créé le 10 octobre 2008  par SAS

Voici un exemple pour effectuer la mise à jour d'une table maitresse avec une autre table en gardant les index.

 
Sélectionnez

-----------------------------------------------
 
/* La table maitresse. */
data BIG ;
  X = 1 ;  Y = 'A' ;  output ;
  X = 2 ;  Y = 'B' ;  output ;
  X = 3 ;  Y = 'C' ;  output ;
run ;
 
/*Création 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;
 
----------------------------------------------- 
Créé le 10 octobre 2008  par SAS
  

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 © 2011 Developpez Developpez LLC. Tous droits réservés Developpez LLC. Aucune reproduction, même partielle, ne peut être faite de ce site ni 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.