Posts Tagged ‘COMPRESS’

h1

Ajouter une date dans un nom de fichier Excel, Word…

mars 12, 2009

Sous SAS, en créant un fichier .xls ou .rtf avec la syntaxe de l’ODS (Output Delivery System), il est parfois pratique d’ajouter dans le nom du fichier une date. Par exemple : listing_20090311.xls.

Nous verrons ici plusieurs représentations de la date et de l’heure : afin d’avoir des noms triables par ordre chronologique, l’année apparaît avant le mois et le jour.

La syntaxe proposée, %SYSFUNC(fonction, format), s’utilise dans d’autres cas que la définition d’un nom de fichier (.rtf, .xls, …). De manière générale, elle sert à utiliser des fonctions en dehors d’une étape data ou d’une procédure. Par exemple, elle peut être ajoutée dans une instruction TITLE.

1. L’objectif pour un programme exécuté le 11 mars 2009

L’objectif de l’exemple qui suit est d’obtenir un fichier .xls nommé class_20090311.xls dont la date change selon le jour de sa création.

La version fixe se présente ainsi : un fichier .xls est créé au moyen de ODS TAGSETS.EXCELXP. Il contient les données du data set SASHELP.CLASS. La création d’un fichier dans la fenêtre OUTPUT est suspendu le temps de la création du fichier .xls au moyen de l’instruction ODS LISTING CLOSE et ODS LISTING.

ods listing close;
ods tagsets.excelxp file='C:/sasref/class_20090311.xls';
proc print data=sashelp.class;
run;
ods tagsets.excelxp close;
ods listing;

2. Ajouter de la flexibilité avec %SYSFUNC

A présent, la date est définie automatiquement au moyen de la macro fonction %SYSFUNC. Cette fonction est dans ce cas particulier composée de deux paramètres :

  • la date SAS extraite au moins de la fonction TODAY()
  • le format à appliquer sur cette date

Résoudre le contenu de la fonction %SYSFUNC grâce aux guillemets doubles : la fonction %SYSFUNC fait partie du langage macro. Dès lors, pour obtenir la résolution de son contenu, il faut utiliser des guillemets doubles.

Retrouver la date d’exécution du programme grâce aux fonctions TODAY() ou DATE () : La fonction TODAY() retourne la date SAS d’exécution du programme. Une alternative est la fonction DATE(). Dans les deux cas, la fonction ne contient pas de paramètre.

Le format YYMMDDn. pour écrire 20090311 : Le format YYMMDDn. est un sous-ensemble de la fonction YYMMDD composée de 8 caractères, sauf indication contraire, faisant apparaître :

  • l’année en premier,
  • suivi du mois en chiffre et
  • enfin du jour.

Ce format avec l’extension « n » a la particularité de ne pas utiliser de symbole ou espace séparatant le jour, du mois et de l’année. Les 8 caractères par défaut de la fonction laisse de la place à une année exprimée par 4 chiffres.

ods listing close;
ods tagsets.excelxp file="C:/sasref/class_%sysfunc(today(),yymmddn.).xls";
proc print data=sashelp.class;
run;
ods tagsets.excelxp close;
ods listing;

3. Tester d’autres formes d’affichage

3.1 Ajouter des tirets bas entre le jour, le mois et l’année grâce à la fonction TRANSLATE

class_2009_03_11.xls : pour avoir des tirets bas (underscore) entre le jour, le mois et l’année, il n’existe pas de format directement applicable. Une solution est alors d’utilise un autre symbole et de le remplacer avec la fonction TRANSLATE.

Ici le format YYMMDD10 retourne une date de la forme 20009-03-11. Les traits d’union (hyphen) sont remplacés par des tirets bas (underscore).

ods tagsets.excelxp file=« C:/sasref/class_%sysfunc(translate(%sysfunc(today(),yymmdd10.),’_’,’-‘)).xls »;

3.2 Ajouter une heure avec TIME() et PICTURE (class_20090311_113057.xls)

Quelle fonction pour l’heure ? : La fonction TIME() retourne l’heure sous la forme d’un time SAS.

Quels formats pour l’heure ? : Le format HHMM. retournera les heures et les minutes, tandis que le format TIME. retournera en plus les secondes. Dans les deux cas cependant, les heures avant 10h apparaissent avec seulement un chiffre : 9:30 et non 09:30. Un espace remplace le zéro manquant.

L’instruction PICTURE de PROC FORMAT pour un format personalisé : Une solution est de créer un format personalisé au moyen de l’instruction PICTURE (PICTURE statement). Comme les lettres H, M et S n’inclus pas de zéro devant (leading zero) pour les nombres à un chiffres, il faut les ajouter dans l’instruction PICTURE.

Note : %0S fait référence aux secondes. Il n’est obligatoire que si vous voulez des secondes dans votre texte final.

proc format;
   picture sasref other=‘%0H%0M%0S’ (datatype=time);
run;

Ensuite, 

  • pour une heure à quatre chiffres (heure + minutes) , il faudra préciser le nombre 4 dans l’appel du format.
  • pour une heures à six chiffres (heures + minutes + secondes), c’est 6 qui doit être ajouté

ods tagsets.excelxp file=« C:/sasref/class_%sysfunc(today(),yymmddn.)_%sysfunc(time(),sasref6.).xls »;

Lectures complémentaires sur http://www.sasreference.fr

ODS

Les fonctions

Les formats :

Les macros fonctions

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;