Posts Tagged ‘LEFT’

h1

9 points pour personnaliser ses titres

mars 28, 2008

silhouettes

Ajouter un titre à vos tableaux et graphiques est simple avec l’instruction TITLE. Je vous rappelle la différence entre les guillemets simples et doubles. Je vous parle des méthodes pour aligner vos titres, etc. Vous saurez ensuite comment supprimer vos titres. Pour rendre vos titres un peu plus flexibles, je vous donne un tuyau (l’option NOBYLINE). Pour ce qui est d’un titre de tableau avec ODS RTF, je vous parle de l’option BODYTITLE. Et pour un titre de graphique, on parlera de l’option NOGTITLE. Bonne lecture.

1. Créer un titre : l’instruction globale TITLE permet d’ajouter un titre. Pour cela, on fait suivre le mot-clé du titre entre guillemets.

title ‘Mon titre’;

2. Créer plusieurs titres : SAS autorise jusqu’à 10 lignes servant de titre. Pour les distinguer, un numéro a été ajouté au mot-clé TITLE1-TITLE10. Ainsi TITLE est équivalent de TITLE1.

title1 ‘Mon premier titre’;
title2 ‘Mon second titre’;

title10 ‘Mon dixième titre’;

3. Supprimer un titre : Par défaut, SAS inscrit « The SAS System » comme titre de vos sorties. Pour l’enlever, vous pouvez soit réécrire dessus ou l’enlever définitivement avec une instruction TITLE vide. Notez que pas seulement le premier titre sera supprimé mais l’intégralité des titres définis.

title ;

4. Un titre sur une seule page d’éditeur : votre titre est long et vous avez besoin d’utiliser la barre de défilement horizontale de votre éditeur SAS pour le lire en entier. La solution est de couper votre titre.

title ‘Ma première partie’
      ‘Ma deuxième partie’
;

5. Guillemets simples ou doubles : pour alléger le programme, utilisez de préférence des guillemets simples. Dans certains cas, cependant, vous aurez besoin de guillemets doubles :

  • Résoudre une macro variable
  • Avoir un titre avec des apostrophes

title « Etude : &numero_etude. »;
title « Don’t do it »;

Une autre solution pour traiter les apostrophes est de mettre deux apostrophes simples l’une à coter de l’autre.

title ‘Don »t do it’;

6. Changer l’alignement : votre titre sera par défaut centré. Pour aligner à gauche, vous pouvez suspendre temporairement l’option globale de centrage (options nocenter; /*votre programme*/ options center). Vous pouvez aussi utiliser l’option pour justifier (j=). Celle-ci peut prendre trois valeurs :

  • j=l (left) pour aligner à gauche,
  • j=c (center) pour centrer,
  • j=r (right) pour aligner à droite.

7. Un texte à gauche et un texte à droite : vous pouvez aussi avoir sur une seule ligne plusieurs éléments à positionner : un à gauche, un à droite et un au milieu.

L’ancienne méthode : l’ancienne méthode consiste à assembler le texte de gauche, x blancs, le texte du milieu, y blancs et le texte de droite. Le tout faisant la largeur de la page. Pour cela un petit calcul s’impose.

  • On prend le nombre total de caractères sur la ligne (linesize).
  • La longueur des trois morceaux de texte y est soustraite.
  • Le reste est divisé par deux. Si on a un nombre impair, les deux textes blancs auront un espace de différence.

La nouvelle méthode : avec SAS 8.2 il existait une alternative, temporairement indisponible sous SAS 9.1.3 mais qui devrait redevenir disponible sous SAS 9.2 (cette année !).

title j=l ‘Mon texte de gauche (left)’
      j=c ‘Mon texte du milieu (center)’
      j=r‘Mon texte de droite (right)’;

En fait, l’option ‘justifié’ (j=) est toujours disponible sous SAS 9.1.3 mais seul le dernier est pris en considération par SAS. D’ici là, il ne vous reste plus que l’ancienne méthode.

8. Personnaliser son titre avec la valeur d’une BY variable : l’option globale BYLINE permet d’ajouter automatiquement un titre pour précisez la valeur d’une valeur BY variable. Par exemple, vous construisez un proc report…; by pop;… D’un côté vous avez la forme automatique avec BYLINE (Par Protocol). De l’autre, vous pouvez personnaliser votre titre (Population : Par Protocol).  Pour cela, on désactive l’option avec NOBYLINE (options nobyline;). Puis on utilise #byvar() et ou #byval() dans le titre. Soit on souhaite faire apparaître le nom de la BY variable soir la valeur de la BY variable. Dans le second cas, cette valeur est rendue parlante avec un format.

title ‘Population : #byval(pop)’;proc report …;
  by pop;
  …;
  format pop pop.;
run;

9. ODS RTF : lorsqu’on crée des documents RTF lisibles par Word, il faut pouvoir adapter les options par défaut des titres pour répondre à ses besoins.

Un titre de tableau dans le corps du document : par défaut les titres d’un tableau sont inclus dans les entêtes du document RTF. Pour qu’il fasse partie intégrante du corps du document, on ajoute l’option BODYTITLE.

Un titre de graphique dans le corps du document : par défaut les titres des graphiques sont inclus dans l’image graphique générée par SAS. Pour que cela ne soit plus le cas, on ajoute l’option NOGTITLE dans l’instruction ODS RTF.

h1

Fini le Moyen-Age pour compter les mots

février 20, 2008

ulrepforte.jpg 

Vous avez une variable composée d’un ou plusieurs mots pour chaque observation, le tout séparé par des espaces, des virgules ou autre. Et vous voulez savoir combien il y a de mots. Avec SAS 9, il est très rapide de trouver le nombre de mots. Avec SAS 8.2, il faut pallier à l’absence de la fonction COUNT. Dans les deux cas, l’idée est la même : on compte les délimiteurs et on ajoute 1.

Prenons le cas des espaces. Dans un premier temps, on enlève les blancs de début et de fin de chaîne. Puis on enlève les doublons entre les mots. Enfin on compte les espaces restants. Il faudra aussi tenir compte du fait qu’une observation puisse ne contenir aucune valeur.

Voici les données qui serviront d’exemple :

data ds_orig;
   x=‘ AB CD GH ‘;
   output;
   x=‘ ‘;
   output;
   x=‘AB ‘;
   output;
run;

1. Avec SAS 9, un calcul rapide : il faudra faire appel à:

  • la fonction STRIP pour les blancs aux extrémités,
  • la fonction COMPBL pour enlever les blancs doublons,
  • la fonction COUNT  pour compter le nombre d’occurrence d’un caractère donné,
  • la fonction MISSING ou un simple = ‘ ‘ pour savoir si la chaîne est vide.

Voici un exemple avec des espaces pour délimiteur.

data sas9 ;
   set ds_orig;
   if x = ‘ ‘ then nb_mots = 0;
   else nb_mots=count(compbl(strip(x)),‘ ‘) + 1;
run;

2. Avec SAS 8.2, il faut contourner l’absence de la fonction COUNT: il existe plusieurs options dont celle-ci utilisant une boucle DO WHILE

  • Les fonctions TRIM et LEFT remplacent la fonction STRIP.
  • Les fonctions COMPLB et MISSING restent valide.
  • Une boucle remplacera la fonction COUNT.

On extrait le 1er mot de la chaîne, puis le 2nd, etc. via la fonction SCAN. Si la valeur trouvée est une valeur manquante, alors le nombre de mots est égal au nombre du boucles sans valeur manquante, c’est-à-dire le nombre de boucles actuel moins 1. Le compteur, ici nommé i, est réinitialisé pour arrêter la boucle DO WHILE.


data sas8_2;
   set ds_orig;
   if missing(x)then cnt_mots=0;
   else
      do;
         z=compbl(trim(left(x)));
         i=1;
         do until (i=0);
         if missing(scan(z,i,‘ ‘))then
            do;
               cnt_mots=i-1;i=->1;
               end;
               i=i+1;
            end;
         drop i z;
   end;
run;

h1

4 fonctions pour enlever les blancs !

janvier 29, 2008

1. Enlever les blancs aux extrémités

Comprendre les anciens programmes et les fonctions TRIM et LEFT : jusqu’à la version SAS 8.2, pour enlever les blancs en début de la chaîne de caractères (leading blank), on les déplaçait à la fin de la chaîne (trailing blank) via LEFT, puis on les enlevait avec TRIM. Cela avait plusieurs inconvénients :

  • Il fallait utiliser deux fonctions TRIM et LEFT ;
  • Il ne fallait pas inverser l’ordre de ces deux fonctions, faute de quoi on arrivait à un résultat différent de ses attentes ;
  • Quand on appliquait cette méthode sur une chaîne de caractère vide, on se retrouvait avec une longueur de 1 au lieu de 0 ; la fonction TRIMN, qui résout ce dernier point, n’est venue qu’après, avec SAS V9.

Savoir utiliser les dernières avancées de SAS, la fonction STRIP : depuis SAS 9.1.3, la fonction STRIP résout les trois problèmes. C’est équivalent à TRIMN(LEFT()).

Si vous enlevez les blancs pour pouvoir faire une concaténation, pensez aux fonctions CATS, CATT et CATX. Pour plus de précisions, vous pouvez vous reporter à l’article « La concaténation : 4 fonctions SAS 9« .

2. Garder un seul blanc entre les mots. Vive la fonction COMPBL : il vous faudra en général un seul espace entre les mots de votre texte. Enlevez alors les doublons via la fonction COMPBL. Vous enlèverez ainsi tous les blancs en fin de chaîne sauf un.

3. Enlever tous les blancs. Vive la fonction COMPRESS : par défaut, la fonction COMPRESS enlève tous les blancs de votre texte. Ajoutez un deuxième paramètre et elle pourra vous enlever d’autres types de caractères. Mais cela dépasse le sujet d’aujourd’hui.

4. Supprimer les x premiers blancs avec RXPARSE et CALL RXCHANGE : la notation qui suit permet de remplacer n’importe quel type de texte par un autre. Ici nous nous limitons aux blancs. Dans un premier temps, définissez la valeur d’avant et la valeur d’après dans RXPARSE. Puis, dans un second temps, définissez les trois voir quatre paramètres de CALL RXCHANGE, à savoir :

  • rappelez cette définition,
  • précisez la variable à actualiser et
  • donner le nombre de fois qu’un changement doit avoir lieu.
  • par défaut, la variable d’origine sera actualisée. Pour créer une nouvelle variable, ajoutez un quatrième paramètre à CALL RXCHANGE ; la longueur de votre nouvelle variable sera de 200 à moins de l’avoir définie autrement auparavant ;

Truc : il ne peut pas y avoir plus de changement que de caractères dans la chaîne. Alors pourquoi ne pas prendre cette longueur pour remplacer tous les blancs. La fonction LENGTHN inclura les blancs en fin de texte et pourra gérer les chaînes de longueur 0.

Un exemple : voici un exemple d’une variable y de longueur 30 qui est créée à partir de la variable x à laquelle on a enlevé ses six blancs.

data one;
   length y $30;
   x= ' ZZZ ABCD AB ' ;
   rx=rxparse(" ' ' to ");
   call rxchange (rx,lengthc(x),x,y);
run;