Dans votre macro HEAD, l'utilisation explicite de %str( ) comme second argument de la fonction %sysfunc(countw(...)) est cruciale car, par défaut, la fonction countw inclut d'autres séparateurs (comme la virgule ou la tabulation) ; forcer l'espace comme unique délimiteur garantit que votre boucle ne se brisera pas si vos noms de tables contiennent des caractères spéciaux inattendus ou si vous passez une liste formatée différemment.
Les données proviennent exclusivement de la librairie SASHELP (sashelp.cars, sashelp.class, sashelp.heart, sashelp.shoes), qui sont des jeux de données d'exemple intégrés à SAS.
1 Bloc de code
PROC PRINT
Explication : Ce bloc initialise la macro variable `make` à 'volvo' et exécute une `PROC PRINT` pour afficher les voitures de cette marque du jeu de données `sashelp.cars`. La comparaison dans la clause `WHERE` utilise la valeur brute de la macro variable, nécessitant une correspondance exacte de la casse.
Copié !
%let make = volvo;
title "Bilar av mérket &make";
proc print data=sashelp.cars;
where make="&make";
var make model msrp;
run;
/* __
| |
| |
__| |__
\ /
\ /
\ /
\/
*/
1
%let make = volvo;
2
3
title "Bilar av mérket &make";
4
PROC PRINTDATA=sashelp.cars;
5
where make="&make";
6
var make model msrp;
7
RUN;
8
9
/* __
10
| |
11
| |
12
__| |__
13
\ /
14
\ /
15
\ /
16
\/
17
*/
2 Bloc de code
PROC PRINT
Explication : Ce bloc réinitialise `make` et utilise la fonction macro `%propcase` pour convertir la valeur de `&make` en casse appropriée ('Volvo') avant que la `PROC PRINT` ne filtre les données. Ceci assure que la comparaison `make="Volvo"` est effectuée, indépendamment de la casse initiale de la macro variable 'volvo'.
Copié !
%let make = volvo;
title "Bilar av mérket &make";
proc print data=sashelp.cars;
where make="%propcase(&make)";
var make model msrp;
run;
/* __
| |
| |
__| |__
\ /
\ /
\ /
\/
*/
1
%let make = volvo;
2
3
title "Bilar av mérket &make";
4
PROC PRINTDATA=sashelp.cars;
5
where make="%propcase(&make)";
6
var make model msrp;
7
RUN;
8
9
/* __
10
| |
11
| |
12
__| |__
13
\ /
14
\ /
15
\ /
16
\/
17
*/
3 Bloc de code
PROC PRINT
Explication : Ce bloc tente d'utiliser la fonction SAS `propcase` directement dans la clause `WHERE` de `PROC PRINT`. Dans ce contexte, `propcase` agit comme une fonction SAS standard appliquée à la chaîne littérale résultante de la résolution de `&make` ('volvo'). La fonction `propcase` est exécutée par le moteur SAS sur la valeur de la colonne `make` et la chaîne 'volvo', permettant une comparaison en casse appropriée.
Copié !
title "Bilar av mérket &make";
proc print data=sashelp.cars;
where make=propcase("&make");
var make model msrp;
run;
/* __
| |
| |
__| |__
\ /
\ /
\ /
\/
*/
1
title "Bilar av mérket &make";
2
PROC PRINTDATA=sashelp.cars;
3
where make=propcase("&make");
4
var make model msrp;
5
RUN;
6
7
/* __
8
| |
9
| |
10
__| |__
11
\ /
12
\ /
13
\ /
14
\/
15
*/
4 Bloc de code
PROC PRINT
Explication : Ce bloc démontre la méthode la plus robuste pour utiliser une fonction SAS (ici `propcase`) dans un contexte macro, en l'encapsulant avec `%sysfunc()`. Cela garantit que `propcase('volvo')` est évalué par le processeur macro en 'Volvo' avant que la clause `WHERE` ne soit passée à `PROC PRINT`, assurant une comparaison correcte.
Copié !
title "Bilar av mérket &make";
proc print data=sashelp.cars;
where make="%sysfunc(propcase(&make))";
var make model msrp;
run;
/* __
| |
| |
__| |__
\ /
\ /
\ /
\/
*/
1
title "Bilar av mérket &make";
2
PROC PRINTDATA=sashelp.cars;
3
where make="%sysfunc(propcase(&make))";
4
var make model msrp;
5
RUN;
6
7
/* __
8
| |
9
| |
10
__| |__
11
\ /
12
\ /
13
\ /
14
\/
15
*/
5 Bloc de code
MACRO
Explication : Première définition de la macro `head`. Elle est conçue pour itérer à travers une liste de tables et utiliser `PROC PRINT` pour afficher les premières `obs` lignes. Cependant, cette version est défectueuse car la macro variable `ANTALTABELLER` n'est pas définie, ce qui provoquerait une erreur lors de l'exécution, la rendant non fonctionnelle en l'état.
Explication : Redéfinition améliorée de la macro `head` et ses appels. Cette version utilise `%sysfunc(countw(...))` pour compter dynamiquement le nombre de tables passées et `%scan` pour extraire chaque nom de table. Elle génère également un titre dynamique pour chaque affichage (`Första &obs raderna i %upcase(&t)`), ce qui la rend plus flexible et fonctionnelle. Les appels à `%head` illustrent son utilisation pour une seule table (`sashelp.class`) et pour plusieurs tables (`sashelp.cars sashelp.heart sashelp.shoes`).
Copié !
%macro head(tabeller=, obs=5);
%local i t;
%do i = 1 %to %sysfunc(countw(&tabeller, %str( )));
%let t = %scan(&tabeller, &i, %str( ));
title "Första &obs raderna i %upcase(&t)";
proc print data=&t(obs=&obs);
run;
%end;
title;
%mend head;
%head(tabeller=sashelp.class)
%head(tabeller=sashelp.cars sashelp.heart sashelp.shoes)
1
%macro head(tabeller=, obs=5);
2
%local i t;
3
%DO i = 1 %to %sysfunc(countw(&tabeller, %str( )));
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.