Posts Tagged ‘check’

h1

Une petite histoire de macro : compter le nombre de mots dans un paramètre de macro

avril 11, 2010

Il est courant de devoir compter le nombre de mots dans un paramètre de macro. Il est par exemple possible de vouloir créer une boucle pour travailler chacun des termes contenu dans cette macro de manière séparée.

Voici donc l’histoire d’une mini macro qu’on nommera CNT_WRD qui crée une macro variable TOT_WRD renvoyant le nombre de mots contenu dans le paramètre TXT.

Ceci est pour vous l’occasion de voir ou revoir un raisonnement possible dans la construction d’une macro sous SAS.

1. Préciser ses besoins, une rapide « spécification »

La macro CNT_WRD composée d’un seul paramètre retournera dans une macro variable TOT_WRD le nombre de mots contenus dans le texte donné dans le paramètre de macro.

Ici on considérera comme mot, tout terme séparé par au moins un blanc.

Si le paramètre de macro est vide, la macro ne devra pas afficher de message d’erreur et la macro variable TOT_WRD sera égale à 1. Par défaut, aucune valeur ne sera entrée dans le paramètre TXT.

La macro variable doit pouvoir être utilisable à l’extérieur de la macro (macro variable globale).

2. Tester la fonction COUNT dans une étape data

La fonction COUNT permet de comptabiliser certains caractères et donc de répondre à ce type de besoin. En fait, cette fonction ne compte pas le nombre de mots mais compte le nombre de caractères définis par le second élément dans la fonction; dans notre cas, elle comptera le nombre de blancs. Il faut donc ajouter 1 au total.

Voici un exemple dans une étape data.

data _null_;
tot_wrd=1+count(‘mot1 mot2’,‘ ‘);
put tot_wrd=;
run;

Dans la log, vous pouvez voir que cnt_wrd=2.

Mais cela ne suffit pas pour gérer les blancs multiples et les blancs aux extrémités. Car si vous avez plus d’un blanc entre chaque mot, chacun sera compté. Il faut donc les enlever au préalable (avec la fonction COMPBL ici). Les blancs de début et fin peuvent s’enlever au moyen de la fonction STRIP.

data _null_;
tot_wrd=1+count(strip(compbl(‘ mot1 mot2 ‘)),‘ ‘);
put tot_wrd=;
run;

Mais que ce passe t-il si notre texte à compter est vide ? TOT_WRD sera égal à 1. Il faut donc ajouter le 1 au total que si le texte à analyser n’est pas vide.

data _null_;
length txt $200;
txt=;
if txt ne ‘ ‘ then tot_wrd=1+count(strip(compbl(txt)),‘ ‘);
put tot_wrd=;
run;

3. Créer la macro

Comme indiqué dans le dernier point, on travaille ici de manière conditionnelle. Si le paramètre de macro TXT est vide, la macro variable CNT_WRD nouvellement créée prend la valeur zéro. Sinon, On passe par la fonction COUNT.

Comme il n’existe pas d’équivalent aux fonctions COUNT et COMPBL en langage macro, il faut encadrer chacune d’elle dans une fonction macro SYSFUNC.

Ici on notera que la fonction STRIP n’apparaît pas. Les blancs de début et de fin en langage macro n’ont aucun impact.

%macro cnt_wrd(txt=);

%global tot_word;

%if &txt.= %then %let tot_wrd=0;
%else %let tot_wrd=%eval(1+%sysfunc(count(%sysfunc(compbl(&txt.)),%str( ))));

%mend cnt_wrd;

Pour représenter un blanc dans une étape data, il suffit d’utiliser des guillemets. En langage macro, on fait appel à la fonction %STR(). Il faudra ne pas oublier d’ajouter un blanc entre les parenthèses.

Afin d’ajouter 1 au résultat de la fonction COUNT, il faut utiliser la macro fonction %EVAL. Le contenu des macro variables sont sinon tous interprétés comme du texte, qu’il s’agisse de nombres ou pas.

Enfin, pour que cette macro variable TOT_WRD soit utilisable en dehors de la macro, il faut qu’elle soit globale. Hors par défaut, une macro variable créée dans une macro est locale, c’est-à-dire n’existe que le temps de la macro. L’instruction %GLOBAL TOT_WRD; résouds le problème.

4. Tester la macro dans le cadre de sa validation

Que se passe t-il quand on ne change pas la valeur par défaut du paramètre de macro ?

%cnt_wrd;
%put Valeur de TOT_WRD: &tot_wrd;

Que se passe t-il quand le paramètre de macro TXT est vide de texte ?
%put Valeur de TOT_WRD: &tot_wrd;

%cnt_wrd(txt=);
%put Valeur de TOT_WRD: &tot_wrd;

Que se passe t-il lorsqu’il n’y a qu’un mot?

%cnt_wrd(txt=mot1);
%put Valeur de TOT_WRD: &tot_wrd;

Que se passe t-il quand il y a plusieurs mots ?

%cnt_wrd(txt=mot1 mot2 mot3);
%put Valeur de TOT_WRD: &tot_wrd;

Que se passe t-il quand il y a des blancs multiples entre les mots, en début et à la fin ?

%cnt_wrd(txt= mot1 mot2 mot3 );
%put Valeur de TOT_WRD: &tot_wrd;

Que se passe t-il quand il y a des blancs multiples entre les mots, en début et à la fin ?

%cnt_wrd(txt=mot1 mot2);
%put Valeur de TOT_WRD: &tot_wrd;

Que se passe t-il quand la macro est appelée plusieurs fois ?

%cnt_wrd(txt=mot1 mot2);
%put Valeur de TOT_WRD: &tot_wrd;
%cnt_wrd(txt=mot1);
%put Valeur de TOT_WRD: &tot_wrd;

Lecture complémentaire

h1

20 pistes pour vérifier le contenu d’un data set

février 16, 2010

AA : Faites des vérifications sur ces données.

BB: Vous avez un descriptif des choses que vous voulez voir vérifier ? AA : Non.

BB: J’imagine donc que vous ne savez pas quelles sont les vérifications les plus importantes ? AA : Oui c’est bien cela.

BB: Vous savez sous quelle forme vous voulez avoir l’information ? BB: Lisible.

Voici quelques pistes pour aborder ce genre de travail.

1. Travailler au niveau de la cellule

Pour chaque variable, listez les valeurs possibles.

  1. la variable A peut ne prendre que les valeurs N ou Y, ne peut prendre que des valeurs manquantes ? (valeurs discrètes).
  2. Dans quel intervalle les valeur sont-elles autorisées ? (valeurs continues).
  3. Les valeurs manquantes sont-elles autorisées ? Si oui, lesquelles pour les variables numériques : le point, .A, ._, etc. ?
  4. Les valeurs numériques doivent-elles être arrondies ?
  5. La case des variables caractères est importante ? Tout doit-il être en majuscule ?
  6. Les blancs de début, de fin ou les blancs multiples sont-ils autorisés ?
  7. Est-ce que plus d’un seul mot est autorisé ?
  8. Est-ce que les caractères spéciaux sont autorisés et si oui lesquels ? Seulement les caractères imprimables ?

2. Le cas particulier des dates

  1. Pour les variables jour, mois et années, clarifiez si la date doit être complète ou non ?
  2. Si une date incomplète est autorisée, parle t-on d’une date où seul le jour peut-être manquant, où le jour et le mois peuvent être manquants, où le jour, le mois et l’année peuvent être manquants ?
  3. Comment gère t-on les dates dans le futur ? Utilise-t-on le moment d’exécution du programme comme date séparant le passé du futur ?  Si le jour et le mois sont manquants, dit-on que l’année en cours est une valeur valide ? Ainsi, si l’année 2011 est entrée, quel est le résultat si le programme est exécuté le 31 décembre 2010 et le 1er janvier 2011 ?
  4. Comment comparer deux dates autorisant des valeurs manquantes ?

3. Travailler avec plusieurs lignes et/ou colonnes

Après avoir vérifier les valeur valables au niveau de la cellule, il s’agit de faire des comparaisons horizontales et verticales, sur toute une ligne, toute une colonne ou seulement certaines variables d’une ligne ou certaines variables d’une colonne. Voir plusieurs lignes et plusieurs colonnes.

  1. Il vous faudra clarifier si les doublons dans une variable sont autorisés.
  2. Pensez à inverser la requête. Par exemple, si les valeurs de ma variable CRITERIA finissent pas OLD alors je parle d’anciens critères. Ma requête vérifiera que lorsque CRITERIA=xxOLD alors FLAG=OLD d’une part et que lorsque FLAG=OLD, CRITERIA=xxOLD : if not (substr(criteria,length(criteria)-2)=’OLD’ and flag=’OLD’);
  3. La plus grande difficulté consistera à éviter d’avoir plusieurs requêtes pour une seule valeur erronée. Par exemple, vous avez trois variables oui/non: AA, BB et CC. La première requête vérifera que AA=Y ou AA=N, que BB=Y ou BB=N et que CC=Y ou CC=N. Ensuite, si AA=Y alors REFEREFENCE ne doit pas être manquant. Il est important ici de ne pas avoir une requête supplémentaire si déjà AA  a des valeurs non autorisés identifiées précédemment.

4. Documenter les requêtes dans un tableau

  1. Vous aurez souvent intérêt à lister toutes vos requêtes dans une table. Que vous lirez par la suite.
  2. Il peut être intéressant d’identifier chaque requête par un nom plutôt qu’un numéro cas très probable où de nouvelles requêtes doivent s’insérer entre des requêtes déjà existantes. Vous pouvez ensuite insérer un numéro pour le tri uniquement.
  3. Une autre table peut servir à lister les exceptions à la règle.

5. Présenter les résultats dans un tableau

Enfin, la présentation sous forme de tableau s’avèrera plus lisible qu’un fichier .rtf, .pdf.

  1. D’une part le volume est moindre avec un tableau qu’avec un fichier textuel. Cela décourage moins les personnes qui doivent le lire.
  2. D’autre part, sous Excel, les utilisateurs apprécieront les filtres et la possibilité de trier les données.

Vous pouvez étendre cette réflexion au cas où vous devez vérifier plusieurs tableaux. Quelles sont les variables communes aux différentes sources. Dans quelle mesure doivent-elles être compatibles ? Est-il préférable de tout programmer dans un seul programme ou d’appeler un programme par requête ? Il faudra