
FAQ SASConsultez toutes les FAQ
Nombre d'auteurs : 14, nombre de questions : 232, dernière mise à jour : 20 décembre 2012
Sommaire→SAS BASE→Gestion de bases de données- Comment lire des données alphanumériques et numériques dans un programme SAS ?
- Comment lire un fichier plat et l'exploiter dans un programme SAS ?
- Comment lire des données qui contiennent des espaces dans un programme SAS ?
- Comment utiliser du SQL avec SAS ?
- Comment fixer une taille à nos variables ?
- Comment lire des données saisies sur une seule ligne ?
- Comment réaliser une boucle dans une table SAS ?
- Comment accéder au numéro de la ligne de la table SAS ?
- Comment faire une fusion horizontale de deux tables 'Merge' ?
- Quelles sont les limites de la fusion horizontale avec un merge ?
- Comment faire une fusion verticale SET ?
- Comment créer une table vide ?
- Comment renommer les variables d'une table SAS ?
- Comment changer le nom d'une table SAS ?
- Comment dupliquer une ligne particulière ?
- Comment changer l'ordre des variables (ou colonnes) d'une table ?
- Comment rajouter un identifiant de type numéro automatique à une table ?
- Comment tester la validité de la saisie utilisateur et lui retourner la position de son éventuelle erreur ?
- Comment garder en mémoire la valeur de la dernière variable lue ?
- Quelle est la différence entre if et where dans une étape data ?
- Comment importer un fichier texte contenant des langues différentes ?
- Comment trier un tableau d'observations selon une ou plusieurs variables ?
- Comment réparer toutes les tables d'une bibliothèque ?
- Quelle est la limite d'une table SAS ?
- Comment conserver les dix meilleurs résultats (top ten) obtenus par groupe ?
- Comment récupérer le nombre d'observations d'une table ?
- Comment vérifier l'état de la base de registre SAS ?
- Peut-on avoir plusieurs serveurs de métadonnées SAS 9 sur la même machine ?
- Comment importer le contenu d'un répertoire dans un dataset ?
- Comment accéder aux données stockées dans un fichier binaire SAS ?
- Comment afficher les informations générales d'un tableau SAS ?
- Comment extraire les doublons d'une table ?
- Comment supprimer une table SAS ?
- Comment ajouter du texte dans un fichier ?
- Comment lire un fichier de données de type texte contenu dans un fichier de type ZIP ?
- Comment lire un fichier hébergé par un serveur internet ou intranet à l'aide d'une instruction FILENAME en version 8 ?
- En version 8 du Système SAS, on obtient parfois des tables SAS avec une extension .sd7 et non .sas7bdat. Comment peut-on lire ces tables en version 8, et comment convertir les fichiers en .sas7bdat ?
- Comment remplacer toutes les valeurs manquantes d'une table par 0 ?
- Comment créer une table SAS à partir de plusieurs fichiers texte, stockés dans un même répertoire, en commençant la lecture des observations sur la nième ligne ?
- Comment mettre à jour un programme ouvert et modifié par plusieurs personnes en même temps ?
- 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 ?
- Comment importer des données d'un fichier texte dans SAS en conservant les variables caractères à point ?
- Comment mettre à jour une table existante par rapport à une autre table, tout en conservant les index ?
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 :
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.
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 :
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.
Et si notre nom d'équipe était en deux parties (séparées par un espace) ? Pour SAS un espace correspond à la valeur suivante :
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.
La procédure PROC SQL permet de manipuler le langage SQL avec SAS.
PROC SQL;
SELECT * FROM base;
QUIT;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 :
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.
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 :
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 :
Obs nom anneecreation nbjoueur
1 sharks 1950 12Donc 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 :
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 :
Obs nom anneecreation nbjoueur
1 sharks 1950 12
2 tigers 1951 33
3 lions 2000 42
4 zodiac 2006 11
5 flyers 2007 42Certains 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.
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
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 :
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 :
PROC PRINT DATA=base LABEL;
WHERE v2 LE 2;
RUN;
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;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.
Les tables doivent avoir la même structure.
DATA fusion;
SET table_1 table_2... table_n;
run;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 :
DATA VIDE;
SET _NULL_;
length a 3;
run;Ou comme suit :
DATA vide; length a 3.; stop;
run;Et pour le SQL :
proc sql;
CREATE TABLE tab (a int);
quit;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" :
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".
Pour changer le nom d'une table SAS vous devez utiliser la procédure DATASETS avec l'option CHANGE comme suit :
PROC SQL;
CREATE TABLE tab (a int);
QUIT;
PROC datasets lib=work;
CHANGE tab=tab_new;
run;
quit;Pour dupliquer une ligne particulière d'une table SAS vous pouvez utiliser l'option OUTPUT dans une étape DATA.
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;Dans une étape DATA, vous pouvez à l'aide de l'option RETAIN changer l'ordre d'impression des variables (ou colonnes) d'une table.
DATA base;
INPUT v1 v2;
CARDS;
1 2
10 3
;
RUN;
DATA base;
RETAIN v2 v1;
SET base;
RUN;
PROC PRINT DATA=base2;
RUN;Pour rajouter un identifiant de type numéro automatique vous pouvez utiliser la fonction _N_ dans une étape DATA.
DATA base;
INPUT v1 v2;
CARDS;
9 5
10 3
;
RUN;
DATA base2;
SET base;
id=_N_;
RUN;La fonction UTILITY vous permet de faire ce genre de manipulation.
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;La fonction LAG vous permet de faire ce genre de manipulation.
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
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
X Y
3 .
5 3
. 5
6 .
1 6
4 1
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.
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 :
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.
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 :
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 :
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.
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; 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.
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;
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*/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 secondsOui, pour cela il est nécessaire d'utiliser différents ports pour chaque serveur de métadonnées.
Voici le code pour importer le contenu d'un répertoire dans un dataset :
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.
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.
Il suffit d'ajouter ce bout de code à votre programme SAS
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.
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;Suppression de toutes les tables de l'espace work :
proc datasets lib=work KILL;
run;
quit;Suppression de la table T1 de l'espace work :
proc datasets lib=work ;
DELETE t1;
run;
quit;
/***************************************/
/* 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; 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.
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'informations 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 ;
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; 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.
%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 ;
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.
%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; 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.
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.
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 :
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; Voici un exemple pour effectuer la mise à jour d'une table maitresse avec une autre table en gardant les index.
-----------------------------------------------
/* 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;
----------------------------------------------- 


