h1

La fonction CATQ pour concaténer tout en ajoutant des guillemets avec SAS 9.3 et plus

février 23, 2019

La fonction catq est disponible depuis SAS 9.3. La particularité de cette fonction est de pouvoir ajouter des guillemets simples (single quotes) ou des guillemets doubles (double quotes) autour des différentes valeurs à concaténer.

Un des avantages de la fonction catq est de pouvoir travailler autant avec les valeurs numériques qu’avec les valeurs caractères. On fera néanmoins attention aux valeurs infinies comme 1/3.

Exemple 1

data catq;
    x=catq('1' ,'ABC ',2," EFG",' ');
    put x=;

    x=catq('2' ,'ABC ',2," EFG",' ');
    put x=;
run;

Dans ce premier exemple, on voit que le 1 permet d’ajouter des guillemets simples alors que le deux permet d’ajouter des guillemets doubles. Dans le cas présent, seules les valeurs caractères ont des guillemets.

x='ABC ' 2 ' EFG' ' '
 x="ABC " 2 " EFG" " "

Exemple 2

data catq;
   x=catq('1'     ,'ABC ',2," EFG",' '); 
   put x=;

   x=catq('1a'    ,'ABC ',2," EFG",' '); 
   put x=;
 
   x=catq('1c'    ,'ABC ',2," EFG",' '); 
   put x=;
   
   x=catq('1ac'    ,'ABC ',2," EFG",' '); 
   put x=;
run;

Dans ce second exemple, on voit que la lettre a pour que toutes les valeurs soient entre guillemets, y compris les valeurs numériques.

Si on souhaite ajouter la virgule (comma) entre les différentes valeurs à concaténer avec la lettre c, il faudra impérativement garder la lettre a.

 x='ABC ' 2 ' EFG' ' '
 x='ABC ' '2' ' EFG' ' '
 x=ABC ,2, EFG,
 x='ABC ','2',' EFG',' '

Exemple 3

Une autre manière d’ajouter la virgule comme séparateur entre les valeurs est d’utiliser la lettre d (delimiter) et de préciser le séparateur dans le second argument de la fonction ; cet argument est optionnel et ne servira qu’avec la lettre d.

data catq;
   x=catq('c','ABC ',2," EFG",' '); 
   put x=;

   x=catq('d',',','ABC ',2," EFG",' '); 
   put x= /;
  
   x=catq('1ac','ABC ',2," EFG",' '); 
   put x=;

   x=catq('1ad',',','ABC ',2," EFG",' '); 
   put x=;
run;

Nous obtenons le même résultat qu’on utilise c ou d avec l’argument optionnel. La lettre d offre juste plus de possibilités.

 x=ABC ,2, EFG,
 x=ABC ,2, EFG,
 x='ABC ','2',' EFG',' '
 x='ABC ','2',' EFG',' '

Exemple 4

Lorsqu’on n’a pas besoin des guillemets autour des différentes valeurs à concaténer, la fonction catq se rapproche de la fonction catx.

data catq;  
   x=catq('d',',','ABC ',2," EFG",' '); 
   put x=/;
   
   x=catq('ds',',','ABC ',2," EFG",' '); 
   put x=;
   
   x=catx(',','ABC ',2," EFG",' ');
   put x=/;
   
   x=catq('dt',',','ABC ',2," EFG",' '); 
   put x=;
run;

Pour enlever les leading et trailing blanks avec la fonction catq, on ajoutera la lettre s (strip).
Pour uniquement enlever les trailing blanks avec la fonction catq, on ajoutera la lettre t (trim).

 x=ABC ,2, EFG,
 x=ABC,2,EFG
 x=ABC,2,EFG
 x=ABC,2, EFG

Aller plus loin

La fonction dispose d’autres arguments pour travailler avec les literals (lettre n), pour afficher les valeurs en hexadecimal (lettre x), pour utiliser une tabulation horizontale comme séparateur (lettre h), etc.
Toutes les informations sont disponibles dans la documentation en ligne : http://support.sas.com/documentation/cdl/en/lefunctionsref/63354/HTML/default/viewer.htm

 

À lire aussi


			
h1

SAS : obtenez des couleurs sympas dans vos rapports en 5 minutes

août 20, 2018

h1

11 Astuces SAS – PDF à télécharger

mars 6, 2018

J’ai écris pour la conférence KSFE qui se déroule chaque année début mars dans une ville différente d’Allemagne un PDF contenant 11 astuces de programmation SAS. Vous pouvez le télécharger sur cette page : https://xxformat.com/blog/ksfe-2018/

h1

SAS Support : quelle version de SAS utilisez-vous ? combien de bits sur votre ordinateur ?

mars 6, 2018

L’article est disponible sur http://www.programmeur-pro.com/sas-support/

h1

Le duo transtrn-trimn comme alternative à tranwrd

novembre 20, 2015

La fonction transtrn en combinaison avec la fonction trimn vous permettre d’enlever un mot sans laisser un blanc.

J’ai mis à jour l’article 5 fonctions pour enlever les blancs sur programmeur-pro.com. Découvrez la syntaxe dans la section 4 de l’article.

h1

A partir de quelle lettre y a-t-il une différence : la fonction compare

mai 25, 2015

La fonction COMPARE retourne le nombre zéro si aucune différence n’existe entre deux chaînes de caractères. Sinon elle retourne la position la position du premier caractère différent.

Dans l’exemple ci-dessous, deux datasets sont créés. Une fois combinés, on s’intéresse à la différence entre la variable LABEL_ONE du premier dataset et la variable LABEL_TWO du second dataset. La première différence a lieu sur la deuxième lettre. La variable DIFF prend donc la valeur 2.

data one;
   length start $8 label_one $8;
   start='1';
   label_one='ABC';
run;

data two;
   length start $8 label_two $8;
   start='1';
   label_two='AbC';
run;

data diff;
   merge one two;
   by start;
run;

data diff;
   set diff;
   diff=compare(label_one,label_two);
run;

proc print data=diff;
run;

Vous pouvez ajouter un troisième paramètre dans la fonction si vous ne voulez pas tenir compte des différences de majuscule, de blancs de début de chaîne de caractère,…

Dans quel cas utiliser cette fonction ? Si vous réalisez un rapport listant la différence entre deux valeurs pour pouvoir ensuite les corriger, vous pouvez utiliser cette fonction pour préciser à partir de quel moment la couleur devra changer.

Pour en savoir plus : la documentation SAS 9.2

h1

Retrouver la semaine avec la fonction WEEK

septembre 28, 2014

A partir d’une date SAS, le numéro de la semaine est extrait avec la fonction WEEK. Cette fonction est composée de deux paramètres: la date SAS obligatoire et une lettre entre guillemets (‘U’,’V’ ou ‘W’) facultative. Ne pas mettre de lettre revient à choisir l’option ‘U’.

Les questions à se poser

La première question à se poser est : le premier jour de la semaine est-il un dimanche ou un lundi ?

La seconde question à se poser est : si le 1er janvier est en semaine, est-ce en semaine 0 ou la semaine 1 ?

Illustration de la fonction WEEK avec un exemple.

Prenons l’exemple de la première semaine de janvier 2015.

  • Jeudi 1er janvier
  • Vendredi 2 janvier
  • Samedi 3 janvier
  • Dimanche 4 janvier
  • Lundi 5 janvier
  • Mardi 6 janvier

Le premier jour de la semaine est un dimanche avec la lettre U. Le 1er janvier sera en semaine zéro.

Tandis que les options V et W considèrent le lundi comme le premier jour de la semaine.

  • Avec l’option V, le 1er janvier sera en semaine 1
  • Avec l’option W, le 1er janvier sera en semaine 0

Tester avec du code SAS

data one;
   today='01JAN2015'd;
   output;
   today='02JAN2015'd;
   output;
   today='02JAN2015'd;
   output;
   today='02JAN2015'd;
   output;
   today='02JAN2015'd;
   output;
   today='02JAN2015'd;
   output;
   today='02JAN2015'd;
   output;
run;

data one;
   set one;
   week=week(today);
   weeku=week(today,'U');
   weekv=week(today,'V');
   weekw=week(today,'W');
run;

proc print data=one;
   format today date9.;
run;

Avec les fonctions SAS, il est important de garder en mémoire que le premier jour de la semaine par défaut est le dimanche et non le lundi. Ainsi la fonction WEEKDAY est également touchée par cette règle. Elle donnera un 1 pour le dimanche et un 2 pour le lundi.

Autres lectures

h1

Vidéo : Pourquoi utilisons la lettre X pour représenter l’inconnue en algèbre ?

juillet 1, 2014

Pour ces vacances d’été, je vous propose de regarder une vidéo de l’émission américaine TED où Terry Moore nous explique pourquoi nous utilisons la lettre X pour représenter l’inconnue en algèbre.

N’hésitez pas à changer le s’éteint pour avoir le sous-titre en Français.

www.ted.com/talks/terry_moore_why_is_x_the_unknown

h1

Lister fichiers et répertoires sous UNIX

novembre 2, 2013

La fonction call system permet dans le cas présent de stocker du code Unix pour rechercher des fichiers dans des répertoires données. Le résultat de la recherche est stocké dans un fichier .txt qui est lu dans une étape data.

1. Créer une macro variable pour stocker le chemin d’accès de la bibliothèque WORK

Le chemin d’accès à la bibliothèque WORK est extrait avec la fonction système PATHNA?E et est stocké dans la macro variable WORKDIR. Ce chemin d’accès sera celui où sera sauvegardé le fichier .txt de la recherche.

%let workdir=%sysfunc(pathname(work));

2. Utiliser call symput pour appeler la commande find d’UNIX 

La commande find est suivie de trois composants :

  • le chemin d’accès au(x) fichier(x) d’entrée. L’astérisk indique que tous les sous répertoire du répertoire PROJET sont consultés
  • le chemin d’accès au fichier final (ici resultat.txt) où sera stocké le résultat de la recherche. Dans l’exemple, le fichier est stocké de manière temporaire dans le répertoire utilisé par la bibliothèque WORK de SAS.
  • La page anglaise de Wikipedia http://en.wikipedia.org/wiki/Find explique que le code 2>/dev/null supprime des messages d'erreurs liés à des droits d'accès.

« If you’re doing this as a user other than root, you might want to ignore permission denied (and any other) errors. Since errors are printed to stderr, they can be suppressed by redirecting the output to /dev/null. »

Dans le second appel le double >> permet d’ajouter au fichier existant le résultat de la recherche au lieu de remplacer l’ancien.

data _null_;
   call system ("find c:/projet/*/demographie.sas7bdat > &workdir./resultat.txt 2>/dev/null
                      c:/project/*/laboratoire.sas7bdat >> &workdir./resultat.txt 2>/dev/null");
run;

L’étape data  sert à lire le fichier .txt et de la trocker dans un dataset (ici REF) via infile/input. Des options à l’instruction infile peuvent être ajoutées pour lire le fichier correctement.

data ref (keep=);

   infile "&workdir./resultat.txt" ;*lrecl=2000 truncover firstobs=1;

   input pathdsn $1-100;

run;
h1

Lecture d’été : Steve Job

mai 15, 2013

Steve Job est a mes yeux un créatif qui a défendu ses idées comme un peindre défend sa toile. Cette personnalité, qu’on aime ou non, ne laisse pas indifférent. Les 900 pages de sa bibliographie très accessible grâce à l’écriture simple et efficace de son auteur Walter Isaacson.

La bibliographie de Steve Job est disponible en version poche pour 8,45 euros.

Steve Jobs

Il existe une version audio pour 25,65 euros (3CDs) disponible à la FNAC. Vu l’écriture, cette version doit être agréable à écouter.

Enfin, Amazon propose une version numérisée sur sa Kindle Steve Jobs pour 10,99 euros. Je n’ai pas trouvé de format epub. Vérifiez bien que la version est en français avant de confirmer l’achat. Sachez que vous pouvez télécharger l’application Kindle gratuitement sur votre ordinateur pour lire la version numérique. Pas besoin d’acheter de Kindle.

h1

42.fr : formation informatique gratuite de 3 ans sur Paris

avril 18, 2013

L’émission de radio hebdomadaire de RMC « de quoi je me mail » a présenté une école privé mais gratuite www.42.fr qui ouvre ses portes à Paris à la rentrée 2013 pour se former en trois ans à l’informatique :

  • Chef de projet informatique
  • Architecte logiciel
  • Architecte réseau
  • Administrateur réseau
  • Développeur web
  • Expert en sécurité
  • Développeur de jeux vidéo
  • etc.

ecole_informatique_42

www.42.fr

Cette école a pour particularité de sélectionner ses profils sur des tests de logiques et non des diplômes. Ainsi pas besoin d’avoir le bac pour postuler.

A priori pas de SAS pour commencer mais qui sait pas la suite …

h1

Passer de CLASS CLAS à « CLASS » « CLAS » dans une macro variable

février 1, 2013

Mettre toutes les mots contenus dans une macro variable entre guillemets (quote en anglais) est un tâche plus fréquente qu’elle n’y paraît.
Une vois le code écrit, il est souvent plus rapide de faire du copier/coller et ensuite de modifier. Voici un exemple où DSN=CLASS CLAS sert à créer DSN_QUOTE= »CLASS » « CLAS ».

1. Exemple dans une macro

Dans l’exemple, la macro est PRINTDSN. Elle a pour tâche d’imprimer dans la log tous les datasets présents dans la bibliothèque SASHELP qui sont cités dans le paramètre de macro DSN, s’ils existent.

%macro printdsn (dsn=);

%let dsn      =upcase(&dsn.);
%let dsn_quote=%sysfunc(tranwrd(%nrstr(%")&dsn.%nrstr(%"),%str( ),%str(" ");

proc sql;
 create table ref as
 select memname
 from dictionary.tables
 where upcase(libname)='SASHELP' and
       upcase(memname) in (&dsn_quote.);
quit;

data _null_;
 set ref;
 call execute ('proc print data=' || memname || ';');
 call execute ('run;');
run;
%mend printdsn;
%printdsn(dsn=class clas);

Pour ma part j’ai pris l’habitude de mettre le contenu des macros paramètres en majuscule, et ce dès le début du programme, sauf besoin spécifique contraire. Ceci explique la ligne %let dsn=upcase(&dsn.);

De plus j’ai pris l’habitude de rajouter le suffixe _quote au nom de la macro variable. Dans notre exemple il y a la macro variable DSN mise en majuscule. Cette variable est ensuite mise entre guillemets.

La macro fonction %sysfunc() permet d’utiliser la fonction tranwrd dans une expression macro. La fonction tranwrd est composée de trois paramètres :

  1. le texte d’origine entre guillemets
  2. le partie de texte à remplacer dans cette chaîne de caractères
  3. le texte de remplacement

2. Le même exemple sans macro

L’exemple est présenté dans une macro. Pour tester le code, un simple %let et %put feront l’affaire. Le résultat s’affiche alors dans la log.

%let dsn=CLASS CLAS;
%let dsn_quote=%sysfunc(tranwrd(%nrstr(%")&dsn.%nrstr(%"),%str( ),%str(" ");
%put &dsn_quote.;
h1

SAS 9.2. : WARNING avec PROC SQL et l’option UNDO_POLICY=NONE

janvier 6, 2013

Depuis SAS 9.2, un nouveau WARNING apparaît dans la log quand le nom de la table SAS d’entrée est le même que le nom de la table SAS de sortie. Pour éviter ce message, l’option undo_policy=none est à ajouter dans l’instruction proc sql;. SAS support prévient néanmoins que l’usage du même nom en entrée et en sortie présente un risque et que l’option enlève l’avertissement mais pas le risque.

1. Le message dans la log

WARNING: CREATE TABLE statement recursively references the target table

 

2. Exemple

Ce code générerait le warning avec SAS 9.2 si l’option undo_policy=none n’était pas utilisée.

proc copy in=sashelp out=work;
   select class;
run;

proc sql undo_policy=none;
   create table class as 
   select name, age
   from class;
quit;

 

En savoir plus

h1

Aller-Retour entre dataset et catalogue de formats avec CNTLIN en CNTLOUT

décembre 29, 2012

Dans un précédent article, je parlais des deux méthodes pour créer des formats avec une procédure proc format, la première étant de taper toutes les values dans une instruction value, la seconde étant de stocker ces valeurs dans un data set et de les convertir en format avec l’option cntlin. Aujourd’hui, je souhaite revenir sur l’option CNTLIN et son pendant CNTLOUT pour passer d’un dataset à un format et pour passer d’un format à un dataset.

1. Créer une table SAS (dataset) type

Pour débuter créons un data set (table SAS) appelée POP avec 4 colonnes START, LABEL, TYPE et FMTNAME. Cette table contient les données pour deux formats : un format numérique et un format alphanumérique. Ces deux formats sont appelés GRP.

data pop;
length start $40 label $200 type $1 fmtname $32;
retain fmtane 'GRP' type 'N';
start='10';
label='Per Protocol';
output;
start='11';
label='Modified Per Protocol';
output;
start='20';
label='Intent-to-Treat';
output;
start='21';
label='Modified Intent-to-Treat';
output;
type='C';
start='PP';
label='Per Protocol';
output;
start='mPP';
label='Modified Per Protocol';
output;
start='ITT';
label='Intent-to-Treat';
output;
start='mITT';
label='Modified Intent-to-Treat';
output;
run;

S’il est possible de convertir de convertir le nombre 100 stocker dans une variable alphanumérique en numérique, il est impossible de convertir le mot ABC en numérique. Dans cet exemple on comprend mieux pour quoi START est toujours alphanumérique qu’il s’agisse dun format numérique ou alphanumérique.

2. Passer d’un dataset à un format catalog

A présent la procédure proc format convertit le data set en format catalogue. Le data set est situé dans la bibliothèque (library) WORK. Il n’y a pas besoin de préciser la bibliothèque de la table POP. Par défaut le format catalog s’appellera FORMATS et sera stocké dans la bibliothèque WORK. L’option LIB n’est pas utilisé.

proc format cntlin=pop;
run;

Ainsi le code au dessus est équivalent à :

proc format cntlin=work.pop lib=work.formats;
run;

Le code proposé ci-dessus est uniquement là pour faciliter la compréhension. Sauf besoin particulier, la version simplifiée doit suffire.

3. Passer d’un format catalog à un dataset

Dans un second temps, je vous propose de convertir ce format dans un autre dataset.

proc format cntlout=pop2; 
run;

Ainsi le code au dessus est équivalent à :

proc format cntout=work.pop2 lib=work.formats; 
run;

A vous de jouez avec les proc print et librairies pour voir la résultat.

4. Rappel sur le nom du format

Notez ici que le nom du format est au maximum long de 32 caractères en  SAS 9.1.3 / SAS 9.2  et limité à 8 caractères pour la version SAS 8.2. Pour être plus précis, on a 32 caractères pour un format numérique et 31 caractères pour un format alphanumérique en SAS 9.1.3 et SAS 9.2, SAS gardant un caractère pour le symbole dollar $. SAS 8.2 fonctionnait sur le même principe : 8 caractères pour un format numérique et 7 caractères pour un format alphanumérique. Si le nom du format était trop long en SAS 8.2, SAS le coupe à la longueur maximum. Ainsi les nom  ALPHABETA et ALPHABETI sont interprétés pas SAS 8.2 en FMTNAME=ALPHABET pour un format numérique.

Aller plus loin

h1

Québec : rencontre des utilisateurs de SAS

octobre 6, 2012

Le club des utilisateurs SAS de Québec organise plusieurs fois dans l’année à l’Université de Laval, des après-midi de rencontre où plusieurs thématiques sont proposées. L’inscription est gratuite. Inscrivez-vous à la newsletter pour être notifié des prochaines rencontres. Retrouvez les présentations des précédentes éditions sur le site http://wp.clubsasquebec.ca/

 

h1

Tous les ans, postulez au SAS Spring Campus

octobre 6, 2012

SAS Academic France, vous propose sur son site de postuler au SAS Spring Campus. Découvrez ici les modalités pour y participer :

https://www.sas.com/fr_fr/academic/sas-spring-campus.html

h1

Protégé : Newsletter Exercices – n°1 : Solution

juillet 14, 2012

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

h1

Livre en anglais : 97 Things Every Programmer Should Know

mars 17, 2012

Voici une lecture que je tenais à vous faire partager. Il s’agit du livre 97 Things Every Programmer Should Know.

Il s’agit d’un recueil de conseils de programmeurs au sens large C++, Java, etc. mais pas de SAS. Chaque témoignage se présente sous la forme d’une double page. Certains exemples sont peux accessibles aux non initiés. Il reste quelques idées générales valables également pour le programmeur SAS. Voici les grandes thématiques :

  • Bugs and Fixes
  • Build and Deployment
  • Coding Guidelines and Code Layout
  • Design Principle and Coding Techniques
  • Domain Thinking
  • Errors, Error Handling, and Exceptions
  • Learning, Skills and Expertise
  • Nocturnal or Magical
  • Performance, Optimization, and Representation
  • Professionalism, Mindset, and Attitude
  • Programming Languages and Paradigms
  • Refactoring and Code Care
  • Reuse versus Repetition
  • Schedules, Deadlines, and Estimates
  • Simplicity
  • Teamwork and Collaboration
  • Tests, Testing, and Testers
  • Tools, Automation, and Development Environments
  • Users and Customers

Vous pouvez consulter les commentaires du livre sur Amazon : 97 Things Every Programmer Should Know

h1

Formation : Institut de Statistique de l’Université de Paris

mars 10, 2012

L’association des anciens élèves de l’ISUP (Institut de Statistique de l’Université de Paris), www.aae-isup.org, propose une vidéo de 5:30 min présentant cette formation sur le net. Cliquez sur l’image pour y accéder.

h1

5 points pour rendre la maintenance d’un programme la plus inaperçu possible pour l’utilisateur

mars 4, 2012

La maintenance des programmes est toujours mieux acceptée si les utilisateurs sont informés au préalable et si la durée de l’intervention est limitée dans le temps. Voici cinq points qui rendront l’intervention plus douce.

  1. S’il est préférable de faire une maintenance de programme dans un environnement de développement, il est parfois plus rapide de faire certains changements directement en production après avoir fait une copie des fichiers d’origine, surtout les changements rapides. L’utilisateur est dans l’indisponibilité d’utiliser le programme durant cet intervalle de temps.
  2. Idéalement la maintenance sera planifiée. Les utilisateurs seront informés une semaine à l’avance par email de la date et durée d’indisponibilité. Ils pourront ainsi adapter leur travail en fonction.
  3. Le créneau horaire sera choisi de préférence en dehors des heures d’utilisation les plus fréquentes (le week-end, le matin, le soir).
  4. Un email informera du début de la maintenance.
  5. Un autre email confirmera la fin de la maintenance et donc la remise à disposition du service.