Optimisez vos étapes DATA : Automatisez l’export de texte avec une fonction FCMP dédiée

Ce code est également disponible en : Deutsch Español
Niveau de difficulté
Débutant
Publié le :
Simon

Le Conseil de l'Expert

Simon
Expert SAS et fondateur.

Utilisez cette fonction pour centraliser vos sorties textuelles. En isolant la gestion des accès fichiers dans une fonction compilée, vous réduisez le risque d'erreurs de syntaxe dans vos étapes DATA et facilitez grandement la maintenance de vos programmes en cas de changement d'architecture ou de système de fichiers.

Attention : Ce code nécessite des droits administrateur.
La macro `%mcf_string2file` génère une fonction FCMP. Cette fonction prend en paramètres le chemin complet d'un fichier, la chaîne de caractères à écrire, et un mode ('CREATE' pour créer/écraser ou 'APPEND' pour ajouter à la fin). Elle utilise les fonctions SAS© de bas niveau (`FILENAME`, `FOPEN`, `FPUT`, `FCLOSE`) pour la manipulation de fichiers. La macro gère également l'option système `CMPLIB` en vérifiant si la librairie de fonctions compilées est déjà déclarée et en l'ajoutant si nécessaire, afin de rendre la fonction immédiatement disponible pour les étapes DATA suivantes. Le paramètre `wrap=YES` permet d'encapsuler la définition de la fonction dans un `PROC FCMP`.
Analyse des données

Type : CREATION_INTERNE


Le script ne lit aucune donnée source. Sa finalité est de créer une fonction réutilisable qui, elle-même, écrit des données textuelles fournies en paramètre dans un fichier sur le système de fichiers. L'origine des données traitées par la fonction est donc externe à ce script mais interne à son propre appel.

1 Bloc de code
PROC FCMP
Explication :
Ce bloc est exécuté si `wrap=YES`. Il utilise `PROC FCMP` pour définir et compiler une nouvelle fonction `mcf_string2file`. La fonction utilise les fonctions de fichiers SAS (`filename`, `fopen`, `fput`, `fwrite`, `fclose`) pour écrire une chaîne de caractères dans un fichier. Elle retourne 0 en cas de succès et -1 en cas d'erreur (ex: impossible d'ouvrir le fichier).
Copié !
1PROC FCMP outlib=&lib..&cat..&pkg;
2 
3function mcf_string2file(filepath $, string $, mode $);
4 IF mode='APPEND' THEN fmode='a';
5 ELSE fmode='o';
6 LENGTH fref $8;
7 rc=filename(fref,filepath);
8 IF (rc ne 0) THEN return( -1 );
9 fid = fopen(fref,fmode);
10 IF (fid = 0) THEN return( -1 );
11 rc=fput(fid, string);
12 rc=fwrite(fid);
13 rc=fclose(fid);
14 rc=filename(fref);
15 return(0);
16endsub;
17 
18 
19QUIT;
2 Bloc de code
OPTIONS
Explication :
Ce bloc de code macro vérifie si la bibliothèque de fonctions (`&lib..&cat`) est déjà présente dans l'option système `CMPLIB`. S'il ne la trouve pas, il l'ajoute dynamiquement via `options insert=(CMPLIB=...)`. Cela garantit que la fonction FCMP qui vient d'être créée est immédiatement accessible dans la session SAS.
Copié !
1/* insert the CMPLIB if not already there */
2%let cmpval=%sysfunc(getoption(cmplib));
3%let found=0;
4%DO i=1 %to %sysfunc(countw(&cmpval,%str( %(%))));
5 %let var=%scan(&cmpval,&i,%str( %(%)));
6 %IF &var=&lib..&cat %THEN %let found=1;
7%END;
8%IF &found=0 %THEN %DO;
9 options insert=(CMPLIB=(&lib..&cat));
10%END;
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.