Le script commence par créer un jeu de données de test contenant quelques dates. Il utilise ensuite la procédure PROC FCMP pour compiler et stocker deux fonctions personnalisées dans le catalogue `work.cat_function`. La première fonction, `DayWeek`, retourne le nom du jour de la semaine (en français ou en anglais) pour une date donnée. La seconde fonction, `NumDayWeek`, retourne le numéro du jour de la semaine (où 1 = Lundi). Ces fonctions sont ensuite testées et appliquées au jeu de données `test`.
Analyse des données
Type : CREATION_INTERNE
Les données utilisées pour le test sont générées directement dans le script via un pas DATA utilisant l'instruction DATALINES.
1 Bloc de code
DATA STEP Data
Explication : Création d'une table SAS temporaire nommée 'test' contenant une variable 'date' alimentée par des données brutes (datalines) pour tester les fonctions.
Copié !
data test;
input date;
informat date date9.;
format date date9.;
datalines;
31DEC2016
05JAN2017
05APR2017
09JUL2017
10NOV2017
31DEC2017
;
run;
1
DATA test;
2
INPUT date;
3
informat date date9.;
4
FORMAT date date9.;
5
DATALINES;
6
31DEC2016
7
05JAN2017
8
05APR2017
9
09JUL2017
10
10NOV2017
11
31DEC2017
12
;
13
RUN;
2 Bloc de code
PROC FCMP
Explication : Définition de la fonction personnalisée 'DayWeek' qui prend une date et un code langue ('EN' ou autre pour FR) et retourne le nom du jour. La fonction est compilée dans le paquetage 'work.cat_function.test'. Elle ajuste le résultat de WEEKDAY pour que Lundi soit le jour 1.
Copié !
proc fcmp outlib=work.cat_function.test;
function DayWeek(DateDay,Language $) $;
/* There is no test if DateDay is a real date.. */
Lg = Language;
nd=WEEKDAY(DateDay);
IF nd = 1
THEN
nd = 7;
ELSE
nd+-1;
length d $ 9;
if Lg='EN' then do;
select (nd);
when (1) d='monday';
when (2) d='tuesday';
when (3) d='wednesday';
when (4) d='thursday';
when (5) d='friday';
when (6) d='saturday';
when (7) d='sunday';
otherwise put 'Not a date !';
end;
end;
else do;
select (nd);
when (1) d='lundi';
when (2) d='mardi';
when (3) d='mercredi';
when (4) d='jeudi';
when (5) d='vendredi';
when (6) d='samedi';
when (7) d='dimanche';
otherwise put 'Not a date !';
end;
end;
return(d);
endsub;
run;
1
PROC FCMP outlib=work.cat_function.test;
2
function DayWeek(DateDay,Language $) $;
3
/* There is no test if DateDay is a real date.. */
4
Lg = Language;
5
nd=WEEKDAY(DateDay);
6
IF nd = 1
7
THEN
8
nd = 7;
9
ELSE
10
nd+-1;
11
LENGTH d $ 9;
12
IF Lg='EN'THENDO;
13
select (nd);
14
when (1) d='monday';
15
when (2) d='tuesday';
16
when (3) d='wednesday';
17
when (4) d='thursday';
18
when (5) d='friday';
19
when (6) d='saturday';
20
when (7) d='sunday';
21
otherwise put 'Not a date !';
22
END;
23
END;
24
ELSEDO;
25
select (nd);
26
when (1) d='lundi';
27
when (2) d='mardi';
28
when (3) d='mercredi';
29
when (4) d='jeudi';
30
when (5) d='vendredi';
31
when (6) d='samedi';
32
when (7) d='dimanche';
33
otherwise put 'Not a date !';
34
END;
35
END;
36
return(d);
37
endsub;
38
RUN;
3 Bloc de code
DATA STEP Data
Explication : Application de la fonction 'DayWeek' sur la table 'test'. Crée deux nouvelles colonnes 'da' (Français) et 'da2' (Anglais). Note : Pour que cela fonctionne sans options globales, la session SAS doit connaître l'emplacement des fonctions CMPLIB, bien que l'option 'cmplib' ne soit pas explicitement définie ici, elle est souvent requise.
Copié !
data test;
set test;
length da da2 $ 9;
format da da2 $9.;
da=DayWeek(date,'FR');
da2=DayWeek(date,'EN');
run;
1
DATA test;
2
SET test;
3
LENGTH da da2 $ 9;
4
FORMAT da da2 $9.;
5
da=DayWeek(date,'FR');
6
da2=DayWeek(date,'EN');
7
RUN;
4 Bloc de code
PROC FCMP
Explication : Définition de la seconde fonction personnalisée 'NumDayWeek'. Elle retourne le numéro du jour sous forme de chaîne de caractères, avec Lundi = 1 et Dimanche = 7.
Copié !
proc fcmp outlib=work.cat_function.test;
function NumDayWeek(DateDay) $;
/* There is no test if DateDay is a real date.. */
nd=WEEKDAY(DateDay);
IF nd = 1
THEN
nd = 7;
ELSE
nd+-1;
length d $ 1;
d=put(nd,1.);
return(d);
endsub;
run;
1
PROC FCMP outlib=work.cat_function.test;
2
function NumDayWeek(DateDay) $;
3
/* There is no test if DateDay is a real date.. */
4
nd=WEEKDAY(DateDay);
5
IF nd = 1
6
THEN
7
nd = 7;
8
ELSE
9
nd+-1;
10
LENGTH d $ 1;
11
d=put(nd,1.);
12
return(d);
13
endsub;
14
RUN;
5 Bloc de code
DATA STEP Data
Explication : Application de la fonction 'NumDayWeek' sur la table 'test' pour créer la colonne 'Numday'.
Copié !
data test;
set test;
length Numday $ 1;
format Numday $1.;
Numday=NumDayWeek(date);
run;
1
DATA test;
2
SET test;
3
LENGTH Numday $ 1;
4
FORMAT Numday $1.;
5
Numday=NumDayWeek(date);
6
RUN;
Ce matériel est fourni "tel quel" par We Are Cas. Il n'y a aucune garantie, expresse ou implicite, quant à la qualité marchande ou à l'adéquation à un usage particulier concernant le matériel ou le code contenu dans les présentes. We Are Cas n'est pas responsable des erreurs dans ce matériel tel qu'il existe maintenant ou existera, et We Are Cas ne fournit pas de support technique pour celui-ci.
Informations de Copyright : Author(s) : Nicolas DUPONT - Creation date : 14/04/2017
SAS et tous les autres noms de produits ou de services de SAS Institute Inc. sont des marques déposées ou des marques de commerce de SAS Institute Inc. aux États-Unis et dans d'autres pays. ® indique un enregistrement aux États-Unis. WeAreCAS est un site communautaire indépendant et n'est pas affilié à SAS Institute Inc.
Ce site utilise des cookies techniques et analytiques pour améliorer votre expérience.
En savoir plus.