L'instruction DO est le moteur de l'intelligence algorithmique au sein de l'étape DATA. Ce script illustre parfaitement la transition d'une programmation séquentielle vers un traitement itératif dynamique. L'élément fondamental à retenir est le rôle de l'instruction OUTPUT : sans elle, SAS n'enregistre que le résultat de la dernière itération. En la plaçant à l'intérieur de la boucle, vous transformez une simple opération de calcul en un puissant générateur de données. Que ce soit pour simuler des scénarios, incrémenter par pas décimaux (BY .25) ou parcourir des listes de valeurs disparates, la boucle DO offre une flexibilité totale pour structurer vos tables.
Type : CREATION_INTERNE
Toutes les tables sont créées dynamiquement à l'aide de boucles et d'assignations de variables au sein des étapes DATA.
| 1 | /* |
| 2 | Demonstration: Simple Illustration of How DO Loops Work |
| 3 | */ |
| 4 | DATA simple1; |
| 5 | DO i = 1 to 4; |
| 6 | answer = 1 + i; |
| 7 | END; |
| 8 | RUN; |
| 9 | |
| 10 | PROC PRINT DATA=simple1 noobs; |
| 11 | RUN; |
| 1 | /* |
| 2 | Demonstration: Using the Output Statement |
| 3 | */ |
| 4 | DATA simple2; |
| 5 | DO i = 1 to 4; |
| 6 | answer = 1 + i; |
| 7 | OUTPUT; |
| 8 | END; |
| 9 | RUN; |
| 10 | |
| 11 | PROC PRINT DATA=simple2 noobs; |
| 12 | RUN; |
| 1 | *Simple example #3; |
| 2 | DATA simple3 (drop=i); |
| 3 | DO i = 1 to 4; |
| 4 | answer = 1 + i; |
| 5 | OUTPUT; |
| 6 | END; |
| 7 | RUN; |
| 8 | |
| 9 | PROC PRINT DATA=simple3 noobs; |
| 10 | RUN; |
| 1 | *Simple example #4; |
| 2 | DATA simple4 (drop=i); |
| 3 | DO i = 0 to 10 BY 2; |
| 4 | answer = 1 + i; |
| 5 | OUTPUT; |
| 6 | END; |
| 7 | RUN; |
| 8 | |
| 9 | PROC PRINT DATA=simple4 noobs; |
| 10 | RUN; |
| 1 | *Simple example #5; |
| 2 | DATA simple5 (drop=i); |
| 3 | DO i = 0 to 10 BY .25; |
| 4 | answer = 1 + i; |
| 5 | OUTPUT; |
| 6 | END; |
| 7 | RUN; |
| 8 | |
| 9 | PROC PRINT DATA=simple5 noobs; |
| 10 | RUN; |
| 1 | *Simple example 6; |
| 2 | DATA simple6 (drop=i); |
| 3 | DO i = 10 to 1 BY -1; |
| 4 | answer = 1 + i; |
| 5 | OUTPUT; |
| 6 | END; |
| 7 | RUN; |
| 8 | |
| 9 | PROC PRINT DATA=simple6 noobs; |
| 10 | RUN; |
| 1 | *Simple example 7; |
| 2 | DATA simple7 (drop=i); |
| 3 | DO i = 10, 12, 23, 147; |
| 4 | answer = 1 + i; |
| 5 | OUTPUT; |
| 6 | END; |
| 7 | RUN; |
| 8 | |
| 9 | PROC PRINT DATA=simple7 noobs; |
| 10 | RUN; |
| 1 | *Nesting do loops; |
| 2 | DATA nested; |
| 3 | DO i = 1 to 10; |
| 4 | DO j = i**2; |
| 5 | OUTPUT; |
| 6 | END; |
| 7 | END; |
| 8 | RUN; |
| 9 | |
| 10 | PROC PRINT DATA=nested noobs; |
| 11 | RUN; |
| 1 | *Example of using do while; |
| 2 | DATA simple8; |
| 3 | DO while (answer < 11); |
| 4 | answer + 1; |
| 5 | OUTPUT; |
| 6 | END; |
| 7 | RUN; |
| 8 | |
| 9 | PROC PRINT DATA=simple8 noobs; |
| 10 | RUN; |
| 1 | *Example of using do until; |
| 2 | DATA simple9; |
| 3 | DO until (answer > 9); |
| 4 | answer + 1; |
| 5 | OUTPUT; |
| 6 | END; |
| 7 | RUN; |
| 8 | |
| 9 | PROC PRINT DATA=simple9 noobs; |
| 10 | RUN; |