Dans notre article précédent, nous avons appris à Skynet comment charger un dictionnaire dans sa mémoireGemini said
Espace de stockage temporaire (RAM) utilisé par le moteur CAS pour charger et traiter les données à haute vitesse, minimisant les accès disque pour optimiser les performances de SAS Viya. RAM pour identifier ses cibles à la vitesse de la lumière. C'était très efficace, mais c'était une mémoireGemini said
Espace de stockage temporaire (RAM) utilisé par le moteur CAS pour charger et traiter les données à haute vitesse, minimisant les accès disque pour optimiser les performances de SAS Viya. morte : Skynet ne faisait que lire ce qu'on lui avait donné.
Mais l'Intelligence Artificielle de Cyberdyne Systems est censée apprendre. Que se passe-t-il si un T-800 sur le terrain découvre une nouvelle faiblesse chez un résistant ? Ou si Skynet veut générer un rapport complet de toutes les données qu'il a en mémoireGemini said
Espace de stockage temporaire (RAM) utilisé par le moteur CAS pour charger et traiter les données à haute vitesse, minimisant les accès disque pour optimiser les performances de SAS Viya. ?
Pour la certification SAS 9 Advanced, vous devez savoir que les Objets Hash ne sont pas qu'en lecture seule. Vous pouvez les modifier en direct et les parcourir de A à Z.
1. Apprentissage en direct : Les méthodes .add() et .replace()
Imaginons que nos Terminators scannent le champ de bataille. S'ils croisent un résistant connu, ils mettent à jour sa dernière position. S'ils croisent un nouveau rebelle, ils l'ajoutent au dictionnaire.
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
set work.rapports_terrain;
length Nom_Rebelle $20 Secteur $10;
if _N_ = 1 then do;
declare hash Dict(); /* Création d'un dictionnaire vide ! */
Dict.defineKey('Nom_Rebelle');
Dict.defineData('Nom_Rebelle', 'Secteur'); /* On met le nom dans Data aussi pour l'export futur */
Dict.defineDone();
end;
/* On cherche si le rebelle est déjà dans la mémoire */
rc = Dict.find();
if rc = 0 then do;
/* Il existe ! On met à jour son secteur */
rc = Dict.replace();
end;
else do;
/* Il n'existe pas ! On l'ajoute à la mémoire */
rc = Dict.add();
end;
run;
Décryptage :
- Contrairement à l'article 13, nous n'avons pas utilisé
dataset:dans ledeclare hash. Nous avons créé un objet vide. - La méthode
.add()insère une nouvelle ligne dans la RAM en utilisant les valeurs actuelles des variablesColonnes d'une table SAS contenant des données spécifiques (numériques ou caractères). Elles possèdent des attributs comme le nom, le type, la longueur, l'étiquette et le format d'affichage. de l'étape DATA. - La méthode
.replace()écrase les données d'une clé existante avec les nouvelles valeurs.
2. Sauvegarder son cerveau : La méthode .output()
Modifier des données dans la RAM, c'est génial, mais rappelez-vous : à la fin du RUN;, l'objet Hash s'évapore et Skynet fait une amnésie totale.
Pour sauvegarder ce dictionnaire fraîchement mis à jour dans une vraie table physique SAS, on utilise la méthode .output(). Et pour s'assurer que ça ne se déclenche qu'à la toute fin du programme, on utilise l'instruction END= du SET.
2
3
4
5
6
7
8
9
10
set work.rapports_terrain end=Derniere_Ligne;
/* ... [Code de déclaration et de mise à jour vu au-dessus] ... */
if Derniere_Ligne then do;
/* Skynet dump sa RAM sur le disque dur */
rc = Dict.output(dataset: 'work.nouvelle_base_rebelles');
end;
run;
3. Lire le dictionnaire de A à Z : Les Hash Iterators (hiter)
Jusqu'ici, l'objet Hash nous servait à faire des recherches ciblées (on donne une clé, il donne la valeur). Mais que faire si Skynet veut simplement lire toutes les lignes du dictionnaire l'une après l'autre, comme dans une boucle ?
L'objet Hash ne sait pas faire ça tout seul. Il a besoin d'un compagnon : le Hash Iterator (hiter).
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
if _N_ = 1 then do;
/* 1. On déclare le Hash en demandant un tri alphabétique ! */
declare hash Dict(dataset: 'work.base_rebelles', ordered: 'yes');
Dict.defineKey('Nom_Rebelle');
Dict.defineData('Secteur');
Dict.defineDone();
/* 2. On déclare l'Itérateur et on l'attache au dictionnaire */
declare hiter Curseur('Dict');
end;
/* 3. On se place sur la première ligne du dictionnaire */
rc = Curseur.first();
/* 4. On boucle tant qu'il y a des lignes */
do while (rc = 0);
output; /* On écrit la ligne dans la table SAS */
rc = Curseur.next(); /* On passe à la ligne suivante */
end;
stop; /* Indispensable pour éviter une boucle infinie car il n'y a pas de SET */
run;
Le conseil Certification 🎓 : L'argument ORDERED
C'est une question classique de l'examen. Par défaut, un objet Hash stocke les données dans un ordre totalement aléatoire (optimisé pour la machine, pas pour l'humain). Si vous utilisez un itérateur (hiter) et que vous voulez que les données sortent triées par rapport à votre clé (par ordre alphabétique des noms de rebelles), vous devez ajouter l'argument ordered: 'yes' ou ordered: 'ascending' (ou 'descending') lors de la déclaration du declare hash.
Si vous oubliez ça, votre .output() ou votre itérateur recrachera les lignes dans le désordre le plus total.
Conclusion
Vous maîtrisez désormais le concept le plus avancé de l'étape DATA. Vous pouvez créer des dictionnaires en mémoireGemini said
Espace de stockage temporaire (RAM) utilisé par le moteur CAS pour charger et traiter les données à haute vitesse, minimisant les accès disque pour optimiser les performances de SAS Viya., les mettre à jour en direct, les trier, les parcourir avec des itérateurs et sauvegarder le résultat. Skynet est devenu une véritable machine d'apprentissage autonome.
Dans l'Article 15, nous allons aborder un sujet beaucoup plus visuel mais tout aussi technique : les formatsInstructions de présentation appliquées aux valeurs des variables pour modifier leur apparence (dates, monnaies, libellés) sans altérer la donnée stockée dans les tables SAS Viya. personnalisés complexes. Vous apprendrez comment utiliser la PROC FORMAT PICTURE pour transformer des suites de chiffres froids en données lisibles, comme des numéros de série de Terminators ou des coordonnées temporelles.






