Le script conduit deux tests principaux. Le premier utilise une table `work.class` (similaire à `sashelp.class`) pour valider le comportement de la macro sur des données standards. Le second test utilise une table `work.test2` contenant des valeurs numériques non-entières et des valeurs manquantes (`.` et `._`) pour s'assurer que la macro gère correctement ces cas spécifiques. Des macros d'assertion (telles que `%mp_assert`, `%mp_assertdsobs`, `%mp_assertscope`), probablement issues du framework de test SASUnit, sont utilisées pour automatiser la validation des résultats et s'assurer de l'absence d'erreurs ou de fuites de portée de macro-variables.
Analyse des données
Type : CREATION_INTERNE
Le script crée deux tables de travail, `work.class` et `work.test2`, en utilisant des instructions `datalines` et `cards`. Aucune donnée externe n'est lue.
1 Bloc de code
DATA STEP Data
Explication : Ce bloc DATA STEP crée la table `work.class`. Il définit la structure de cinq variables et les remplit à partir de données intégrées directement dans le code via l'instruction `datalines4`, en utilisant le délimiteur ',' grâce à l'option DSD.
Copié !
data work.class ;
attrib
Name length= $8
Sex length= $1
Age length= 8
Height length= 8
Weight length= 8
;
infile cards dsd;
input
Name :$char.
Sex :$char.
Age
Height
Weight
;
datalines4;
Alfred,M,14,69,112.5
Alice,F,13,56.5,84
Barbara,F,13,65.3,98
Carol,F,14,62.8,102.5
Henry,M,14,63.5,102.5
James,M,12,57.3,83
Jane,F,12,59.8,84.5
Janet,F,15,62.5,112.5
Jeffrey,M,13,62.5,84
John,M,12,59,99.5
Joyce,F,11,51.3,50.5
Judy,F,14,64.3,90
Louise,F,12,56.3,77
Mary,F,15,66.5,112
Philip,M,16,72,150
Robert,M,12,64.8,128
Ronald,M,15,67,133
Thomas,M,11,57.5,85
William,M,15,66.5,112
;;;;
run;
1
DATA work.class ;
2
attrib
3
Name LENGTH= $8
4
Sex LENGTH= $1
5
Age LENGTH= 8
6
Height LENGTH= 8
7
Weight LENGTH= 8
8
;
9
INFILECARDS dsd;
10
INPUT
11
Name :$char.
12
Sex :$char.
13
Age
14
Height
15
Weight
16
;
17
datalines4;
18
Alfred,M,14,69,112.5
19
Alice,F,13,56.5,84
20
Barbara,F,13,65.3,98
21
Carol,F,14,62.8,102.5
22
Henry,M,14,63.5,102.5
23
James,M,12,57.3,83
24
Jane,F,12,59.8,84.5
25
Janet,F,15,62.5,112.5
26
Jeffrey,M,13,62.5,84
27
John,M,12,59,99.5
28
Joyce,F,11,51.3,50.5
29
Judy,F,14,64.3,90
30
Louise,F,12,56.3,77
31
Mary,F,15,66.5,112
32
Philip,M,16,72,150
33
Robert,M,12,64.8,128
34
Ronald,M,15,67,133
35
Thomas,M,11,57.5,85
36
William,M,15,66.5,112
37
;;;;
38
RUN;
2 Bloc de code
Macro Data
Explication : Ce bloc exécute le premier scénario de test. Il appelle la macro `%mp_getmaxvarlengths` sur `work.class` pour générer `work.myds`. Il vérifie ensuite l'absence d'erreurs globales et le bon nombre de lignes en sortie. Un DATA STEP crée la table `work.errs` si des longueurs calculées sont incorrectes. Enfin, une macro d'assertion valide que cette table d'erreurs est vide.
Copié !
/* regular usage */
%mp_assertscope(SNAPSHOT)
%mp_getmaxvarlengths(work.class,outds=work.myds)
%mp_assertscope(COMPARE,desc=checking scope leakage on mp_getmaxvarlengths)
%mp_assert(
iftrue=(&syscc=0),
desc=No errs
)
%mp_assertdsobs(work.myds,
desc=Has 5 records,
test=EQUALS 5
)
data work.errs;
set work.myds;
if name='Name' and maxlen ne 7 then output;
if name='Sex' and maxlen ne 1 then output;
if name='Age' and maxlen ne 3 then output;
if name='Height' and maxlen ne 8 then output;
if name='Weight' and maxlen ne 3 then output;
run;
data _null_;
set work.errs;
putlog (_all_)(=);
run;
%mp_assertdsobs(work.errs,
desc=Err table has 0 records,
test=EQUALS 0
)
1
/* regular usage */
2
%mp_assertscope(SNAPSHOT)
3
%mp_getmaxvarlengths(work.class,outds=work.myds)
4
%mp_assertscope(COMPARE,desc=checking scope leakage on mp_getmaxvarlengths)
5
%mp_assert(
6
iftrue=(&syscc=0),
7
desc=No errs
8
)
9
%mp_assertdsobs(work.myds,
10
desc=Has 5 records,
11
test=EQUALS 5
12
)
13
DATA work.errs;
14
SET work.myds;
15
IF name='Name' and maxlen ne 7THENOUTPUT;
16
IF name='Sex' and maxlen ne 1THENOUTPUT;
17
IF name='Age' and maxlen ne 3THENOUTPUT;
18
IF name='Height' and maxlen ne 8THENOUTPUT;
19
IF name='Weight' and maxlen ne 3THENOUTPUT;
20
RUN;
21
DATA _null_;
22
SET work.errs;
23
putlog (_all_)(=);
24
RUN;
25
26
%mp_assertdsobs(work.errs,
27
desc=Err TABLE has 0 records,
28
test=EQUALS 0
29
)
3 Bloc de code
DATA STEP Data
Explication : Ce bloc DATA STEP crée une seconde table, `work.test2`, pour un cas de test plus complexe. Il inclut des variables avec des valeurs numériques non-entières et des valeurs manquantes standard (`.`) et spéciales (`._`).
Copié !
/* test2 */
data work.test2;
length a 3 b 5;
a=1/3;
b=1/3;
c=1/3;
d=._;
e=.;
output;
output;
run;
1
/* test2 */
2
DATA work.test2;
3
LENGTH a 3 b 5;
4
a=1/3;
5
b=1/3;
6
c=1/3;
7
d=._;
8
e=.;
9
OUTPUT;
10
OUTPUT;
11
RUN;
4 Bloc de code
Macro Data
Explication : Ce bloc exécute le second scénario de test sur la table `work.test2`. Il vérifie que `%mp_getmaxvarlengths` fonctionne correctement avec des valeurs numériques complexes et manquantes. Le processus est identique au premier test : appel de la macro, validation des résultats via des assertions et un DATA STEP de vérification, et confirmation finale que la table d'erreurs (`work.errs2`) est vide.
Copié !
%mp_getmaxvarlengths(work.test2,outds=work.myds2)
%mp_assert(
iftrue=(&syscc=0),
desc=No errs in second test (with nulls)
)
%mp_assertdsobs(work.myds2,
desc=Has 5 records,
test=EQUALS 5
)
data work.errs2;
set work.myds2;
if name='a' and maxlen ne 3 then output;
if name='b' and maxlen ne 5 then output;
if name='c' and maxlen ne 8 then output;
if name='d' and maxlen ne 3 then output;
if name='e' and maxlen ne 0 then output;
run;
data _null_;
set work.errs2;
putlog (_all_)(=);
run;
%mp_assertdsobs(work.errs2,
desc=Err table has 0 records,
test=EQUALS 0
)
1
%mp_getmaxvarlengths(work.test2,outds=work.myds2)
2
%mp_assert(
3
iftrue=(&syscc=0),
4
desc=No errs in second test (with nulls)
5
)
6
%mp_assertdsobs(work.myds2,
7
desc=Has 5 records,
8
test=EQUALS 5
9
)
10
DATA work.errs2;
11
SET work.myds2;
12
IF name='a' and maxlen ne 3THENOUTPUT;
13
IF name='b' and maxlen ne 5THENOUTPUT;
14
IF name='c' and maxlen ne 8THENOUTPUT;
15
IF name='d' and maxlen ne 3THENOUTPUT;
16
IF name='e' and maxlen ne 0 THENOUTPUT;
17
RUN;
18
DATA _null_;
19
SET work.errs2;
20
putlog (_all_)(=);
21
RUN;
22
23
%mp_assertdsobs(work.errs2,
24
desc=Err TABLE has 0 records,
25
test=EQUALS 0
26
)
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.
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.