Archive for the ‘Fonctions’ Category

h1

Protégé : Plusieurs formats pour une variable numériques – passer à une variable caractère avec la fonction PUTN

octobre 14, 2010

Cet article est protégé par un mot de passe. Pour le lire, veuillez saisir votre mot de passe ci-dessous :

Publicités
h1

Protégé : Newsletter Mars : solution

mars 1, 2010

Cet article est protégé par un mot de passe. Pour le lire, veuillez saisir votre mot de passe ci-dessous :

h1

Protégé : Les expressions régulières, un exemple avec des crochets à remplacer

février 8, 2010

Cet article est protégé par un mot de passe. Pour le lire, veuillez saisir votre mot de passe ci-dessous :

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

Enlever certains caractères spéciaux avec la fonction TRANSLATE

février 23, 2009

Cet article est réécrit. Découvrez le sur : programmeur-pro.com

 

 

Les 256 caractères ASCII (American Standard Code for Information Interchange) comprennent :

  • les lettres de l’alphabet,
  • les chiffres
  • des lettres accentuées propres à certains langues comme le E accent aigü
  • des caractères non imprimables comme un tabulation, un retour à la ligne ou un espace.  

Ils peuvent notamment arriver dans une table suite à l’importation d’un fichier Excel où ils sont présents. En général, la plupart de ces caractères spéciaxu ne sont pas désirés.

Quels sont ces caractères et comment les éliminer ?

1. Quels sont les 34 caractères non imprimables ?

Les caractères ASCII sont numérotés :

  • de 0 à 256 (valeur décimale)
  • de 00 à FF (valeur hexadécimal)
  • Unicode

 

Cet article est réécrit. Découvrez le sur : programmeur-pro.com

 

Les 33 premiers caractères (0 à 32) et le caractère 127 sont forment les caractères non imprimables.

 DEC HEX  Description
  0   00   NUL Null
  1   01   STX Start of Header
  2   02   SOT Start of Text
  3   03   ETX End of Text
  4   04   EOT End of Transmission
  5   05   ENQ Enquiry
  6   06   ACK Acknowledge
  7   07   BEL Bell
  8   08   BS BackSpace
  9   09   HT Horizontal Tabulation
 10   0A   LF Line Feed
 11   0B   VT Vertical Tabulation
 12   0C   FF Form Feed
 13   0D   CR Carriage Return
 14   0E   SO Shift Out
 15   0F   SI Shift In
 16   10   DLE Data Link Escape
 17   11   DC1 Device Control 1 (XON)
 18   12   DC2 Device Control 2
 19   13   DC3 Device Control 3 (XOFF)
 20   14   DC4 Device Control 4
 21   15   NAK Negative acknowledge
 22   16   SYN Synchronous Idle
 23   17   ETB End of Transmission Block
 24   18   CAN Cancel
 25   19   EM End of Medium
 26   1A   SUB Substitute
 27   1B   ESC Escape
 28   1C   FS File Separator
 29   1D   GS Group Separator
 30   1E   RS Record Separator
 31   1F   US Unit Separator
 32   20   [Space] Space
127   7F   DEL Delete

Source : ascii-table.com

 

Cet article est réécrit. Découvrez le sur : programmeur-pro.com

 

2. Un exemple, le symbole « Line Feed »

L’image ci-dessous présent ene feuille Excel. La cellule A1 contient un passage à la ligne. Celui-ci indique la présence du caractère spéciale 0A (valeur hexadécimale).

hexadecimal_fr

Après la création d’une table SAS à partir d’un PROC IMPORT, cela donne un petit carré qui ne s’imprimera pas.

hexa_sas_fr

2. Comment éliminer des caractères spéciaux?

En fait, deux choix se présentent :

  • soit vous éliminez les caractères spéciaux,
  • soit vous les remplacez par des blancs

Dans les deux cas, la fonction TRANSLATE peut servir.

Créer le data set pour l’exemple :

data sasref;
   f1=cat('Partie1','0A'x,'Partie2');
run;

Enlever le caractères spécial spécial grâce à la fonction TRANSLATE : la fonction TRANSLATE est composée de trois paramètres : le texte d’origine, les nouveaux caractères et les caractères à remplacer.

data sasref;
   set sasref;
   f2=translate(f1,' ','0A'x);
run;

Le résultat : J’ai choisi de créer une nouvelle variable F2 afin d’afficher simultanément le texte avant et le texte après.

hexa_sas_apres

La différence entre les fonctions TRANSLATE et TRANWRD :

  • A la différence de la fonction TRANWRD, chacune des lettres est remplacée et non des mots.
  • De plus, ici les caractères à remplacer sont cités en dernier (3ème paramètre de la fonction TRANSLATE). Tandis que TRANWRD commence par eux (2ème paramètre de laf onction TRANWRD).

Remplacer plus d’un caractère  : vous pouvez lister autant de caractères hexadécimaux dans le troisième paramètre de la fonction TRANSLATE.

Ici, SAS remplacera les dix premiers caractères ASCII numérotés 00, 01, 02,…09, 0A, s’ils existent, pas un espace.

data sasref;
   set sasref;
   f2=translate(f1,' ','000102030405060708090A'x);
run;

 

Cet article est réécrit. Découvrez le sur : programmeur-pro.com

 

Lectures complémentaires :

 

Cet article est réécrit. Découvrez le sur : programmeur-pro.com

 

Annexe :

Reproduire le fichier Excel : Dans Word, tapez le texte en ajoutant un passage à la ligne. Copiez ensuite ce texte dans au niveau de la base fonction (fx).

Importer le fichier Excel dans SAS :

proc import file='C:/sasref/hexa.xls'
            out=sasref
	   replace;
	   getnames=no;
run;

Cet article est réécrit. Découvrez le sur : programmeur-pro.com

 
h1

Deux réponses possibles avec la fonction IFN

janvier 19, 2009

Les fonctions IFN et IFC existent depuis la version 9.1 de SAS. Elles permettent de retourner une valeur si une condition est remplie et une autre si ce n’est pas le cas. Je vous propose d’illustrer la fonction IFN en combinaison avec la fonction LAG.

1. La différence entre les fonctions IFN et IFC

La fonction IFN retourne une valeur numérique alors que la fonction IFC retourne une valeur caractère.

2. Trois paramètres obligatoires pour ces fonctions et un optionnel

Dans un premier temps, il s’agit de définir une condition.

  • Paramètre 1 : définir la condition

Dans un second temps, on assigne chacune des valeurs prises par la nouvelle variable selon que

  • Paramètre 2 : valeur si la condition est remplit,
  • Paramètre 3 : valeur si la condition n’est pas remplit
  • Paramètre 4 : valeur si la condition donne une valeur manquante (optionnel).

3. L’exemple

Dans cet exemple, on a trois variables : PATIENT_ID et CNTRY_ID sont les variables clés. STRT_DT est la date de début d’un effet secondaire.

data adverse_events;
   input patient_id cntry_id $ strt_dt;
   informat strt_dt date9.;
   datalines;
999 DE 03MAR2004
999 DE 04MAR2004
999 DE 06MAR2004
111 AU 12DEC2003
111 AU 15DEC2003
;
run;

On souhaite créer une nouvelle variable contenant la date précédente par patient.

patient_id cntry_id  strt_dt    prev_dt

    999       DE    03MAR2004       .
    999       DE    04MAR2004   03MAR2004
    999       DE    06MAR2004   04MAR2004
    111       AU    12DEC2003       .
    111       AU    15DEC2003   12DEC2004

La solution classique serait d’utiliser un FIRST qui implique que les données soient triées au préalable par patient.

proc sort data=adverse_events;
   by patient_id cntry_id;
run;

data adverse_events;
   set adverse_events;
   by patient_id cntry_id;
   prev_dt=lag(strt_dt);
   first.cntry_id then prev_dt=.;
run;

Mais maintenant qu’on a la fonction IFN, la démarche est plus rapide. Dans notre exemple, seuls les trois paramètres obligatoires de la fonction IFN sont utilisés.

data adverse_events;
   set adverse_events;
   prev_dt=ifn(patient_id=lag(patient_id) and cntry_id=lag(cntry_id),
               lag(strt_dt),
               .);
run;

4. Liens

SAS Online Doc

La fonction LAG

h1

Scanner une chaîne de caractère et extraire le xème mot

septembre 12, 2008

Scanner le contenu d’un texte et identifier le xème « Mot » est possible sous SAS grâce à la fonction SCAN. Je vous propose dans un premier temps de voir les différents paramètres de la fonction. Puis dans un second temps, vous aurez à disposition quelques exemples documentés à tester soi-même.

Deux exemples d’applications :

  • Définir une condition (IF THEN par exemple) selon la valeur prise par le mot trouvé.
  • Sauvegarder le « mot » dans une nouvelle variable.

1. Trois paramètres pour la fonction SCAN

La fonction SCAN est composée de trois paramètres.

  1. Le texte à scanner
  2. La position du mot recherché
  3. Le symbole délimitant les mots dans le texte

1.1 Le texte à scanner est donné dans le premier paramètre

Le texte à scanner peut-être une chaîne tapée manuellement entre guillemets. Mais il est plus probable que vous souhaitiez opérer l’opération pour chacune des observations contenues dans une variable caractère.
Il s’agit alors de nommer la variable.

Rappel : lorsqu’une variable est nommée, il ne faut jamais mettre son nom entre guillemets. La fonction SCAN ne fait pas exception.

1.2 La position du mot recherché est définie dans le second paramètre

Des nombres entiers : la position du mot est donnée par un nombre entier.

  • 1 correspond au premier mot de la chaîne de caractères;
  • 2 au deuxième, etc.

Les valeurs négatives : il est en effet possible d’utiliser des valeurs négatives pour définir la position du mot. De quoi s’agit-il ? Tout simplement, au lieu de commencer par le début de la chaîne, SAS commence par la fin.

  • -1 correspond au dernier mot,
  • -2 à l’avant dernier mot, etc.

1.3 Le délimiteur apparaît en troisième

Trouver des « mots » au sens large du terme : En langage courant, un mot est un ensemble de lettres séparées par un espace. Avec la fonction SCAN, le symbole séparant les mots est libre. L’utilisateur se chargera de définir ce symbole.

Le symbole séparant les mots est à donner entre guillemets. A titre d’exemple, il peut s’agir de tirets bas (underscore en anglais), de barre inclinée (slash en anglais), de blancs (blank en anglais).

2. La fonction SCAN par l’exemple

Exemple 1 : Dans ce premier exemple, une variable NAME contient 5 observations.

data dict;
   length name $8;
   input name $;
   datalines;
PAT_ID
COUNTRY
REC_ID
VISIT
VISIT_DT
;
run;

Grâce à la première condition, les observations se terminant par _DT sont sauvegardées dans le data set DT_VAR. Il n’y a que la variable VISIT_DT.
Avec la seconde condition, les observations commençant par VISIT_ sont envoyées dans le data set VISIT_VAR.

data dt_var visit_var;
   set dict;
   if scan(name,-1,‘_’)=‘DT’ then output dt_var;
   if scan(name,1,‘_’)=‘VISIT’ then output visit_var;
run;

Exemple 2 : Dans ce second exemple, une variable PATH a 3 observations.

data path_lst;
   path=‘c:/sasref/projet123/study1/pgm’;
   output;
   path=‘c:/sasref/projet123/study9/pgm’;
   output;
   path=‘c:/sasref/projet444/study2/pgm’;
   output;
run;

Dans ce premier cas, les observations contenant le mot proj123 en troisième niveau dans le chemin d’accès sont gardées.

data projet123;
   set path_lst;
   if scan(path,3,‘/’)=‘projet123’;*then output;
run;

Dans ce second cas, une nouvelle variable est créée. Elle contient le numéro de l’étude disponible en quatrième position dans le chemin d’accès fourni dans la variable PATH.

data study_var;
   study=scan(path,4,‘/’);
run;

Je vous donne rendez-vous demain samedi pour un article sur l’option FMTSEARCH.