FAQ SASConsultez toutes les FAQ
Nombre d'auteurs : 14, nombre de questions : 232, dernière mise à jour : 20 décembre 2012
- 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 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 :
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 42
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.
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 seconds
Oui, pour cela il est nécessaire d'utiliser différents ports pour chaque serveur de métadonnées.
Voici le code pour importer le contenu d'un répertoire dans un dataset :
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
;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-