Posts Tagged ‘ODS’

h1

SAS 9.2 Souligner ou barrer un texte dans une table en sortie ODS

juillet 14, 2011

Avec SAS 9.2 il est maintenant possible de souligner/barrer des valeurs d’une table dans une sortie ODS et plus seulement dans le titre.

L’exemple est basé sur une sortie .pdf. TEXTDECORATION=UNDERLINE souligne les valeurs. TEXTDECORATION=LINE-THROUGH barre les valeurs et TEXTDECORATION=OVERLINE (usage très rare a priori) ajoute une ligne au dessus du texte.

ods listing close;
ods pdf file=‘c:/sasref’;
proc print data=sashelp.class;
var name / display style(column)=[textdecoration=underline];
var sex / display style(column)=[textdecoration=line-through];
var age / display style(column)=[textdecoration=overline];
run;
ods pdf close;
ods listing;

Lecture complémentaire

SUGI, pour visualiser le résultat : http://www2.sas.com/proceedings/sugi31/227-31.pdf

h1

Deux exemples d’usage de la syntaxe de l’ODS : PROC PRINT et PROC REPORT

juin 26, 2011

Jusqu’à présent, j’ai présenté la syntaxe de l’ODS (Output Delivery System) de SAS avec la procédure PROC REPORT pour générer vos tableaux dans des fichiers .rtf (ODS RTF), .pdf (ODS PDF) ou en XML avec extension .xls (ODS TAGSETS.EXCELXP).

PROC PRINT se révèle dans les cas les plus simples aussi avantageux. Voici deux fichiers .pdf contenant la même table, une fois générée avec PROC REPORT et une fois avec PROC PRINT.

ods listing close;

*1. Exemple de l’ODS avec PROC REPORT;

ods pdf file=‘O:/sasref/exemple_report.pdf’;
proc report data=sashelp.class nowd;
columns sex age;
define sex / display style(column)=[cellwidth=2cm];
define age / display style(column)=[cellwidth=3cm];
run;
ods pdf close;

*2. Exemple de l’ODS avec PROC PRINT;

ods pdf file=‘O:/sasref/exemple_print.pdf’;
proc print data=sashelp.class nobs;
var sex / style(column)=[cellwidth=2cm];
var age / style(column)=[cellwidth=3cm];
run;
ods pdf close;

ods listing;

h1

Répéter la valeur d’une variable sur chaque page avec ODS RTF

septembre 26, 2010

Il y a un peu plus d’un mois, je vous parlais de l’option SPANROWS de PROC REPORT pour pouvoir répéter une valeur groupée sur chaque page du listing.

Mais si vous devez créer un fichier .RTF et non un fichier .PDF ou si vous n’avez pas SAS 9.2, vous pouvez vous rabattre sur cette solution.

Elle présente le seul inconvénient de séparer la table en table distincte à chaque nouvelle valeur du la variable groupée.

Voici donc un exemple à tester par vous même.

1. Le setting

Par simple soucis de présentation, quelques instructions de paramétrage sont données.

  • Enlever le titre par défaut avec l’instruction TITLE.
  • Enlever la date et le numéro de page par défaut et alignez le résultat à gauche.
  • Créer un format caractère SEX où M réfère à Garçon et F à Fille.


*——————————————–;
* Setting;
*——————————————–;

title;
options nodate nonumber nocenter;

proc format;
value $ sex ‘M’=‘Garçon’
‘F’=‘Fille’;
run;

2. Préparation des données

Afin d’avoir assez de données le fichier CLASS est multiplié par 5. Les noms sauvegardés dans la variable NAME sont incrémentés d’un nombre.

*——————————————–;
* 2. Data Preparation;
*——————————————–;

data class;
set sashelp.class;
output;
name=cats(name,’1′);
output;
name=cats(name,’2′);
output;
name=cats(name,’3′);
output;
name=cats(name,’4′);
output;
name=cats(name,’5′);
output;
run;

3. Reporting;

Vos données doivent être triées afin d’utiliser l’instruction BY dans PROC REPORT.

L’option d’ODS RTF STARTPAGE=NEVER empêchera le passage à une nouvelle feuille à chaque nouvelle valeur de la variable SEX.

Au moyen des options COMPUTE/ENDCOMP, il est possible de personnaliser le texte en début de chaque page. Un texte aligné à gauche est ajouté. Une ligne avant et une ligne après sont ajoutées pour faciliter la lisibilité du rapport. Ce texte est composé de « SEXE :  » suivi de la valeur formatée de la variable SEX.

*——————————————–;
* 3. Reporting;
*——————————————–;

proc sort data=class;
by sex;
run;

*options nobyline;

ods rtf file=’C:/…/test1.rtf’ startpage=never;
proc report data=class;
by sex;
column sex name;
define sex  / /*id*/ group noprint ;
define name / display  ‘Nom’;

compute before _page_ /style=[just=left] ;
line ‘ ‘;
line @1 ‘Sexe:’ @6 sex $sex. ;
line ‘ ‘;
endcomp;

run;

ods rtf close;

h1

Avec ODS, comment ajouter des caractères spéciaux ≤ et ≥

septembre 19, 2010

Comment inclure dans un rapport généré par ODS les symboles ≤ et ≥ ? En effet, ils ne font pas parti des caractères spéciaux ASCII classiques, il s’agit de caractères dépendants d’une police de caractères en particulier : la police « symbol ».

SAS propose un article sur le sujet. Je vous propose de détailler l’exemple utilisé qui a été utilisé avec SAS 8.2 sous environnement DBCS.

1. Setting

Dans cette instruction ODS ESCAPECHAR, est précisé que l’accent circonflexe sera utilisé, non pas comme simple caractère, mais comme caractère introduisant une notation particulière pour le style.

ods escapechar= »^ »;

Un format appelé TEMP est créé. La valeur 11 aura un label composé du symbole « inférieur ou égal ».

  • Le symbole « inférieur ou égal » en lui même est introduit par le code hexadécimal A3.
  • Pour que ce que code corresponde à « inférieur ou égal », il faut utiliser la police de caractère, d’où le code font_face=symbol.
  • Avant A3, on change le style et en particulier la police de caractère. Notez ici l’accent circonflexe introduit précédemment pour entrer la police.
  • Après A3, on arrête d’utiliser cette police.

proc format;
value temp 11=‘The value is ^S={font_face=symbol}’ « A3″x ‘^S={} the value’;
run;

2. Reporting

A présent SAS va écrire tout ce qui suite dans un fichier temp.rtf. Vous avez ici seulement besoin de préciser le chemin d’accès au fichier dans les guillemets.

Le résultat s’affichera correctement dans votre fichier .RTF mais pas dans votre sortie listing classique. Autant fermer cette destination avec ODS LISTING CLOSE.

ods listing close;

ods rtf file=‘temp.rtf’;

Les deux tableaux imprimé se basent sur la table CLASS dans la bibliothèque SASHELP.

Dans le premier cas, le format créé précédemment est appliqué à la variable AGE. On aura dont le label de format défini précédemment quand AGE=11.

title ‘This uses the special characters in the value’;
proc print data=sashelp.class;
format age temp.;
run;

Dans ce second exemple, le symbole « supérieur ou égal » est introduit avec le code hexadécimal B3 d’où « B3″x.

Comme précédemment, il est entouré de ^S={font_face=symbol} avant et ^S={} après.

Cette fois ci pas contre le symbole est ajouté dans le label d’une variable. Chacun des groupes de mot est donc mis entre guillemets.

title ‘This uses the special characters in the label’;
proc print data=sashelp.class label;
label age=« Age » « ^S={font_face=symbol} » « B3″x « ^S={} » « 10 »;
run;

Enfin, on précise de former le fichier .rtf et donc de ne plus ajouter d’info dedans à partir de maintenant.

ods rtf close;

ods listing;

Source : Usage Note 24054: In ODS, how can I add special characters such as GE or LE to my output?

Lecture complémentaire

h1

Une option SAS 9.2 pour ODS PDF : répéter une valeur groupée sur plusieurs pages

août 3, 2010

Lorsque vous construisez un listing avec ODS PDF et PROC REPORT l’option GROUP de l’instruction DEFINE sert à n’afficher chaque valeur de la variable concernée qu’une seule fois.

Hors, si cette valeur s’applique aux observations de plusieurs pages, elle ne sera pas répétée à moins d’ajouter l’option SPANROWS nouvelle avec SAS 9.2.

Cette options ne fonctionne pas actuellement avec ODS RTF.

Voici un exemple pour tester par vous même.

1. Le setting

Par simple soucis de présentation, quelques instructions de paramétrage sont données.

  • Enlever le titre par défaut avec l’instruction TITLE.
  • Enlever la date et le numéro de page par défaut et alignez le résultat à gauche.
  • Créer un format caractère SEX où M réfère à Garçon et F à Fille.


*——————————————–;
* Setting;
*——————————————–;

title;
options nodate nonumber nocenter;

proc format;
value $ sex ‘M’=‘Garçon’
‘F’=‘Fille’;
run;

2. Préparation des données

Afin d’avoir assez de données le fichier CLASS est multiplié par 5. Les noms sauvegardés dans la variable NAME sont incrémentés d’un nombre.

*——————————————–;
* 2. Data Preparation;
*——————————————–;

data class;
set sashelp.class;
output;
name=cats(name,’1′);
output;
name=cats(name,’2′);
output;
name=cats(name,’3′);
output;
name=cats(name,’4′);
output;
name=cats(name,’5′);
output;
run;

3. Reporting

Enfin la section qui nous intéresse vraiment : générer un fichier .RTF et un fichier .PDF avec l’option SPANROWS et voir que que seul ODS RTF tient compte de cette option pour répéter l’observation en début de chaque nouvelle page.


*——————————————–;
* 3. Reporting;
*——————————————–;

ods listing close;
ods rtf file=‘C:\sasref\test1.rtf’;
ods pdf file=‘C:\sasref\test1.pdf’;


proc report data=class spanrows nowd;
column sex name;
define sex / group ‘Sexe’;
define name / display ‘Nom’ ;
run;


ods pdf close;
ods rtf close;
ods listing;

h1

Passer d’un format A4 à un format LETTRE

mars 1, 2010

Vous voulez imprimer les fichiers RTF générés avec ODS RTF dans une autre forme que le format A4. Quelle option utiliser pour utiliser un autre format standard comme le format LETTRE ? Comment personnaliser la zone d’impression et gérer les marges en conséquences ?

1. Par défaut, le papier est au format A4 (21cm/29,7cm)

ods listing close;
ods rtf file=‘C:/sasref/margin_example.rtf’;
proc print data=sashelp.class;
run;
ods rtf close;
ods listing;

2. Changer la taille du papier pour l’impression pour une lettre (21,59cm/27,94cm)

options papersize=letter;

ods listing close;
ods rtf file=‘C:/sasref/margin_example.rtf’;
proc print data=sashelp.class;
run;
ods rtf close;
ods listing;

3. Personnaliser la taille (21cm/27,94cm)

Afin de personnaliser les marges dans l’instruction globale OPTIONS, je choisi ici d’enlever toute valeur au niveau du template (undefine margin). Ensuite ce template TEST_PAPERSIZE est appelé dans l’instruction ODS RTF.

proc template;
Define Style style.test_papersize;
parent=styles.rtf;
style Body from Body /
leftmargin=_undef_
right margin=_undef_
topmargin=_undef_
bottommargin=_undef_;
End;
run;

De la taille du papier, il faut enlever les marges. Ici, nous voulons un papier avec une largeur de 21cm et une hauteur de 27,94cm. Les marges étant de 2 centimètres de chaque côté, on enlève 4 cm à la hauteur et 4 cm à la largeur définie par l’option PAPERSIZE.

Les paramètres de l’option PAPERSIZE :

  1. Le 1er paramètre : la largeur
  2. Le 2ème paramètre : la hauteur

options papersize=(’17cm’,‘23.94cm’) leftmargin=2cm rightmargin=2cm topmargin=2cm bottommargin=2cm;

ods listing close;
ods rtf file=‘C:/sasref/margin_example.rtf’ style=test_papersize;
proc print data=sashelp.class;
run;
ods rtf close;
ods listing;

Note : j’ai obtenu le résultat escompté avec Word 2003 mais pas avec Word 2007. Vous pouvez apporter un commentaire avec votre expérience sur le sujet.

h1

Windows et ODS, stopper la fenêtre pop-up

février 1, 2010

Sous Windows, SAS propose par défaut l’ouverture du fichier RTF, PDF, etc. généré au moyen de la syntaxe de l’ODS. Quelle instruction permet de stopper l’affichage de cette fenêtre ?

1. Par défaut, une fenêtre pop-up propose d’ouvrir ou d’enregistrer le fichier.

Dans ce petit exemple un fichier RTF est créé dans le répertoire C:/sashelp. Il contient la variable NAME du data set SASHELP.CLASS.

L’affichage dans la fenêtre OUTPUT est stoppée avec l’instruction ODS LISTING CLOSE.

L’affichage dans la fenêtre REPORT (propre à Windows) est stoppée avec l’option NOWD.

ods listing close;
ods rtf file=‘C:/sasref/Vero.rtf’;
proc report data=sashelp.class nowd;
columns name;
define name / display;
run;
ods rtf close;
ods listing;
ods results;

ods noresults;
ods listing close;
ods rtf file=‘c:/sasref/Vero.rtf’;
proc report data=sashelp.class nowd;
columns name;
define name / display;
run;
ods rtf close;
ods listing;

2. Avec ODS NORESULTS, la fenêtre pop-up se fait oublier

L’instruction ODS NORESULTS avant ODS RTF stoppe l’affichage de la fenêtre pop-up.

En fin de programme, une instruction ODS RESULTS réactive l’action par défaut.

ods noresults;
ods listing close;
ods rtf file=‘C:/sasref/Vero.rtf’;
proc report data=sashelp.class nowd;
columns name;
define name / display;
run;
ods rtf close;
ods listing;
ods results;

ods noresults;
ods listing close;
ods rtf file=‘c:/sasref/Vero.rtf’;
proc report data=sashelp.class nowd;
columns name;
define name / display;
run;
ods rtf close;
ods listing;
ods results;
h1

Ajouter des liens hypertextes dans vos fichiers PDF

octobre 4, 2009

Dans cet article, je vous propose d’ajouter des liens hypertextes dans vos fichiers .PDF créés avec la syntaxe de l’ODS PDF. Pour illustrer ce sujet, nous créerons une table des matières (table of contents ou TOC) rustique avec ODS PDF TEXT=’ ‘; où il suffira de cliquer sur la section qui vous intéresse pour l’atteindre.

1. Le principe de base

Pour ajouter des liens hypertextes, il faut deux informations :

  • la location du point d’encrage/de destination (anchor)
  • le lien vers ce point d’encrage

ods escapechar=‘^’;

ods listing close;
ods pdf file=‘C:/sasref/hyperlink_toc.pdf’;

ods pdf text=‘Table of Contents’;
ods pdf text= »;
ods pdf text=‘^S={url=’#hommes’}1. Hommes’;
ods pdf text=‘^S={url=’#femmes’}2. Femmes’;

ods pdf anchor=‘hommes’;
ods pdf text=1. Hommes’;
proc print data=sashelp.class(where=(sex=‘M’));
run;

ods pdf anchor=‘femmes’;
ods pdf text=‘2. Femmes’;
proc print data=sashelp.class(where=(sex=‘F’));
run;

ods pdf close;
ods listing;

Le point d’encrage : Le point d’encrage est donné par l’instruction ods pdf anchor=‘…’;. Entre guillemets est donné un nom de votre choix qui servira à l’identifier.

Le lien hypertexte : Le lien vers ce point d’encrage est donné par le mot URL à préciser sous forme de style donné au texte sur lequel cliquer.

ods pdf text=‘^S={url=’#…’}Je clique ici’;

Définition d’un style : Le style est défini avant le texte par S={…}. Pour indiquer à SAS qu’il faille interpréter ce texte comme un style et non un texte brut, un caractère doit précédé le tout. J’ai choisi le symbole du chapeau défini auparavant avec l’instruction ods escapechar=‘^’;

2. Personnaliser le style

Supprimer l’affichage du bookmark : Dans la version enrichie qui suit, j’ai choisi l’option NOTOC pour éviter l’affichage du bookmark sur la gauche de l’écran propre aux fichier PDF.

Les sauts de pages à la demande: J’ai aussi choisi d’enlever par défaut tous les sauts de pages ods pdf startpage=never; puis d’ajouter une fois un saut de page entre la table des matières et les tableaux avec ods pdf startpage=now;

Les en-têtes en moins : Le titre par défaut, la date et le numéro des pages sont enlevés :

title;
options nodate nonumber;

Les liens hypertextes invisibles : Par défaut, le lien hypertexte est présenté par un cadre bleu autour du texte à cliquer. Pour enlever ce cadre, travaillez le style avec ACTIVELINKCOLOR, VISITEDLINKCOLOR et LINKCOLOR.

ods pdf text=« ^S={activelinkcolor=white
visitedlinkcolor=white
linkcolor=white
url=’…’}… »
;

D’autres styles permettent ici d’affiner la présentation :

  • VJUST : ajustement vertical du texte
  • CELLHEIGHT : hauteur de la case contenant le texte
  • CELLWIDTH : largeur de la case contenant le texte
  • FONT_FACE : la police de style
  • FONT_SIZE : la taille du texte
  • INDENT : l’indentation du texte
  • FONT_WEIGHT : mise en gras du texte

J’ai choisi de sauvegarder ces informations dans des macros variables pour pouvoir centraliser l’information en début de programme.

3. Le résultat

Deux pages sont donc créées. La première contient la table des matières. Vous pouvez cliquer sur le texte 1. Hommes ou 2. Femmes pour rejoindre le tableau qui vous intéresse.

hyperlink_toc

hyperlink_main

Annexe : l’intégralité du code

%let titl=vjust=middle
cellheight=30pt
cellwidth=17cm
font_face=arial
activelinkcolor=white
visitedlinkcolor=white
linkcolor=white;
%let titl1=&titl indent=5cm font_size=16pt font_weight=bold;
%let titl2=&titl indent=6cm font_size=12pt;

title;
options nonumber nodate;
ods escapechar=’^’;

ods listing close;
ods pdf file=‘C:/sasref/hyperlink_toc.pdf’ notoc startpage=never;

ods pdf text=« ^S={&titl1.}Table of Contents »;
ods pdf text= »;
ods pdf text=« ^S={&titl2. url=’#hommes’}1. Hommes »;
ods pdf text=« ^S={&titl2. url=’#femmes’}2. Femmes »;

ods pdf startpage=now;

ods pdf anchor=‘hommes’;
ods pdf text=« ^S={&titl2.}1. Hommes »;
proc print data=sashelp.class(where=(sex=‘M’));
run;

ods pdf anchor=‘femmes’;
ods pdf text=« ^S={&titl2.}2. Femmes »;
proc print data=sashelp.class(where=(sex=‘F’));
run;

ods pdf close;
ods listing;

h1

Plusieurs tableaux par feuille de calcul (ODS TAGSETS.EXCELXP)

août 13, 2009

Avec SAS, la syntaxe de l’ODS TAGSETS.EXCELXP permet de créer des fichiers .xls. Voici comment imprimer créer plusieurs feuilles de calculs et d’inclure dans chacune d’elle plusieurs tableaux.

1. Plusieurs feuilles de calcul

Il est possible d’ inclure plusieurs tableaux dans des feuilles de calcul différentes. C’est le cas par défaut. Le nom de chaque feuille est personnalisable avec l’option SHEET_NAME=’xxx’.

Ici deux tables sont imprimées dans deux feuilles de calcul distinctes.

ods listing close;
ods tagsets.excelxp file=‘c:/sasref/multi_sheets.xls’;

ods tagsets.excelxp options(sheet_name=‘<13 ans’);
proc print data=sashelp.class (where=(age < 13));
run;

ods tagsets.excelxp options(sheet_name=‘>=13 ans’);
proc print data=sashelp.class (where=(age >= 13));
run;

ods tagsets.excelxp close;
ods listing;

Le résultat :

xls_multi_sheets

2. Plusieurs tables dans une feuille de calcul grâce à SHEET_INTERVAL=’none’

Il est également possible d’afficher toutes les tables sur une feuille de calcul avec l’option SHEET_INTERVAL=’none’.

Ici,  deux tableaux sont affichées dans la même feuille de calcul.

ods listing close;
ods tagsets.excelxp file=‘c:/sasref/multi_tables.xls’ options(sheet_interval=‘none’ sheet_name=‘Multi Ages’);

proc print data=sashelp.class (where=(age < 13));
run;

proc print data=sashelp.class (where=(age >= 13));
run;

ods tagsets.excelxp close;
ods listing;

Le résultat :

xls_multi_tables

3. Plusieurs tableaux par feuille

Voici maintenant comment agencer le code pour mettre plusieurs tableaux sur une feuille de calcul et plusieurs autres sur une autre feuille.

Ici deux tables sont affichées dans  la première feuille et deux autres dans la seconde feuille de calcul. A chaque fois qu’une nouvelle feuille de calcul est à créer l’option SHEET_INTERVAL=’none’. Entre temps, tous les tableaux sont affichés sur la même feuille.

ods listing close;
ods tagsets.excelxp file=‘c:/sasref/multi_tables_sheets.xls’;

ods tagsets.excelxp options(sheet_name=‘<13 ans’ sheet_interval=‘none’);
proc print data=sashelp.class (where=(sex=‘M’ and age < 13));
run;
proc print data=sashelp.class (where=(sex=‘F’ and age < 13));
run;

ods tagsets.excelxp options(sheet_name=‘>=13 ans’ sheet_interval=‘none’);
proc print data=sashelp.class (where=(sex=‘M’ and age >= 13));
run;
proc print data=sashelp.class (where=(sex=‘F’ and age >= 13));
run;

ods tagsets.excelxp close;
ods listing;

Le résultat :

xls_multi_tables_sheets

Lectures complémentaires

h1

Indenter ses titres et pieds-de-page dans un fichier PDF

août 2, 2009

Comment couper ses titres et ajouter des indentations dans un fichier PDF avec SAS ? La solution deux petits mots-clés -2n et m précédés d’un symbole défini par vous-même auparavant.

Notez que cette syntaxe fonctionne aussi pour les pieds-de-page.

Si le passage à la ligne fonction avec ODS RTF, l’indentation par contre n’est pas prise en compte.

1. Par défaut un titre est sur une seule ligne

Dans l’exemple qui suit, un titre est donné dans une instruction TITLE.

Ce titre est aligné à gauche (J=L entendez par là justify=left).

Pour faciliter la lecture du programme, le titre est écrit sur plusieurs lignes. Mais au final, tout le texte apparaît sans passage à la ligne.

ods listing close;
title j=l
‘SASHELP.CLASS:’
‘Première Variable: Nom’
‘Seconde Variable: Sex’
‘Troisième Variable: Age’;
ods pdf file=‘C:/sasref/indent_title.pdf’;
proc print data=sashelp.class noobs;
run;
ods pdf close;
ods listing;

title_01_default

2. Passer à la ligne avec ODS ESCAPECHAR et ^-2n

A présent, un passage à la ligne est créé avec le mot -2n.

Pour que SAS n’utilise par ce mot comme un texte devant apparaître dans le titre, ce mot est précédent d’un symbole de son choix (ici un chapeau) défini précédemment avec l’instruction ODS ESCAPECHAR.

ods escapechar=‘^’;
ods listing close;
title j=l
‘SASHELP.CLASS:’
‘^-2nPremière Variable: Nom’
^-2nSeconde Variable: Sex’
^-2nTroisième Variable: Age’;
ods pdf file=‘C:/sasref/indent_title.pdf’;
proc print data=sashelp.class noobs;
run;
ods pdf close;
ods listing;

title_02_linebreak

3. Passer à la ligne et indenter le titre avec ODS ESCAPECHAR, ^-2n et ^m

A présent, l’encre ^m est ajoutée en4ème position dans la première ligne. Cela veut dire que tout le texte qui suit est indenté et débutera en position 4 sous la lettre H de SASHELP.CLASS.

ods escapechar=‘^’;
ods listing close;
title j=l
‘SAS^mHELP.CLASS:’
‘^-2nPremière Variable: Nom’
^-2nSeconde Variable: Sex’
^-2nTroisième Variable: Age’;
ods pdf file=‘C:/sasref/indent_title.pdf’;
proc print data=sashelp.class noobs;
run;
ods pdf close;
ods listing;

title_03_indent

Lectures complémentaires

h1

Changer la couleur d’une ligne ou d’une colonne via PROC REPORT et ODS

juillet 30, 2009

Après vous avoir présenter comment changer la couleur d’une cellule dans un fichier .xls, je vous propose de voir comment changer la couleur de toute une colonne ou de toute une ligne avec PROC REPORT et ODS TAGSETS.EXCELXP. Cela est intéressant pour distinguer votre ligne/colonne TOTAL du reste de vos données. Notez que la syntaxe s’applique également avec ODS RTF et ODS PDF par exemple.

1. Changer le style de couleur pour une colonne

Pour changer la couleur d’une colonne, on utilisera STYLE(COLUMN)=[] dans l’instruction DEFINE de son choix.

Pour changer la couleur d’une ligne, il faudra passer par COMPUTE/ENDCOMP et CALL DEFINE. Pour changer la couleur d’une celulle, nous avions dans le précédent article utiliser _COL_ comme premier argument. Pour appliquer la couleur à toute la ligne, il suffira de remplacer ce premier argument par _ROW_.

ods listing close;
ods tagsets.excelxp file=‘C:/sasref/col_row_color.xls’;

proc report data=sashelp.class nowd;
column name age;
define name / ‘Nom’ display style(column)=[background=lightblue];
define age / ‘Age’ display;
compute age;
if age=15 then call define (_ROW_,‘style’,‘style=[background=lightblue foreground=red ]’);
endcomp;
run;

ods tagsets.excelxp close;
ods listing;

Dans l’exemple ci-dessus la colonne Nom est mise en bleu clair. Les lignes où l’âge est égal à 15 ans sont mises en bleu clair également et le texte est mis en rouge.

2. Voir le résultat

xls_color_row_column

Lectures complémentaires

h1

Un moyen simple de changer les couleurs en fonction des valeurs prises par des variables dans un fichier .xls

juillet 26, 2009

Suite à la question de Pierre, je vous invite à découvrir comment changer la couleur de données selon leur valeurs dans un fichier .xls généré au moyen d’ODS TAGSETS.EXCELXP et PROC REPORT.

1. Le code de base à améliorer

ODS TAGSETS.EXCELXP FILE=’…xls ‘ / ODS TAGSET.EXCELXP CLOSE : Pour l’exemple, un fichier CLASS_COLOR.XLS est créé.

PROC REPORT : Il contient les données de la variable AGE disponibles dans la table SASHELP.CLASS.

ODS LISTING CLOSE/ODS LISTING : Aucune sortie n’est envoyée vers la destination traditionnelle LISTING le temps de la création du fichier .xls.

ods listing close;
ods tagsets.excelxp file=‘C:/sasref/class_color.xls’;
proc report data=sashelp.class nowd;
column age;
define age / ‘Age’ display;
run;
ods tagsets.excelxp close;
ods listing;

2. L’ajout de COMPUTE dans PROC REPORT

A présent les intructions COMPUTE et ENDCOMP englobe une condition. Si la variable AGE est égale à 15 alors tous la valeur 15 est mise en rouge (foreground=) et la couleur de fond de la cellule est bleu clair (background=).

Pour cela, on utilise CALL DEFINE si et seulement si AGE=15. CALL DEFINE est composé de trois paramètres :

  • _COL_
  • ‘style’
  • ‘style=[à compléter]’

ods listing close;
ods tagsets.excelxp file=‘C:/sasref/class_color.xls’;
proc report data=sashelp.class nowd;
column age;
define age / ‘Age’ display;
compute age;
if age=15 then call define (_COL_,‘style’,‘style=[background=lightblue foreground=red]’);
endcomp;
run;
ods tagsets.excelxp close;
ods listing;

3. Voir le résultat

xls_compute

4. Quelques styles supplémentaires

Pour compléter la liste des styles, vous avez par exemple:

  • Changer la taille des caractères : font_size=14pt (mettre en taille 14 points)
  • Changer l’inclinaison des caractères : font_style=italic (mettre en italique)
  • Changer l’épaisseur des traits formant les caractères : font_weight=bold  (mettre en gras)
  • Changer la police de caractères : font_face= »Courier New, Arial » (utiliser Courier New si disponible, sinon utiliser Arial).

Lectures complémentaires :

h1

Personnaliser l’apparence des titres et pieds-de-page dans un fichier.xls (ODS TAGSETS.EXCELXP et PROC TEMPLATE)

juillet 14, 2009

Après vous avoir présenté les options EMBEDDED_TITLES et EMBEDDED_FOOTNOTES dans l’article : Ajouter les titres et pieds-de-page dans une feuille de calcul du fichier .xls, je vous propose de personnaliser l’apparence de vos titres au moyen d’un nouveau style créé dans une instruction PROC TEMPLATE.

1. Créer un style personnaliser pour ses titres et pieds de page

Le nouveau style s’appelle XLS_TITL. Comme base, nous prenons un style existant sous SAS : STYLES.DEFAULT et faisont quelques modification au niveau des titres et pieds-de-page.

proc template;
define style styles.xls_titl;
parent=styles.rtf;

style systemtitle from systemtitle /
background=transparent
foreground=#000000
font_style=roman
font_weight = medium
font_size=18pt
font_face=‘Arial’;

style systemfooter from systemfooter/
background=transparent
foreground=#000000
font_style=roman
font_weight = medium
font_size=14pt
font_face=‘Arial’;

end;
run;

  • BACKGROUND modifie la couleur de font des cellules (voir l’article : choisir ses couleurs sous SAS). Notez que le mot TRANSPARENT ne fonctionne pas avec la version 1.86 de TAGSETS.EXCELXP mais avec certaines versions plus anciennes. Mettre à jour ses TAGSETS pour EXCELXP »
  • FOREGROUND modifie la couleur du texte
  • FONT_STYLE empêche l’inclinaison par défaut (enlever l’italique : roman, mettre en italic : italic)
  • FONT_WEIGHT enlève la côté gras présent par défaut (enlever les gras : medium, mettre en gras : bold)
  • FONT_SIZE défini la taille des caractères
  • FONT_FACE liste les polices à utiliser. Si plusieurs polices sont listées entre guillemets, la première disponible sur l’ordinateur sera retenue.

2. Appeler le style dans l’instruction ODS TAGSETS.EXCELXP

L’option STYLE= a été ajouté dans la première instruction ODS TAGSETS.EXCELXP . Elle est suivie du nom du style créé préalablement. Cela donne STYLE=XLS_TITL.

ods listing close;
ods tagsets.excelxp file=‘C:/sasref/class.xls’ style=xls_titl
options(embedded_titles=‘yes’
embedded_footnotes=‘yes’);

title ‘Titre’;
footnote ‘Pied’;
ods tagsets.excelxp;

proc report data=sashelp.class nowd;
columns name age;
define name/display ‘Nom’;
define age /display ‘Age’;
run;

ods tagsets.excelxp close;
ods listing;

Pour le reste des explications concernant cette syntaxe, reportez-vous à l’article de la semaine dernière.

3. Voir le résultat

02_xls_title

Lectures complémentaires :

h1

Ajouter les titres et pieds-de-page dans la feuille de calcul du fichier .xls

juillet 9, 2009

Lors de la création d’un fichier .xls au moyen de la syntaxe ODS TAGSETS.EXCELXP sous SAS, le contenu des instructions TITLE et FOOTNOTE est envoyé respectivement dans l’entête et pied-de-page du fichier. Ils ne sont donc visibles qu’à l’impression.

Pour insérer le contenu des instructions TITLE et FOOTNOTE dans la feuille de calcul, il faudra ajouter deux options dans l’instruction ODS TAGSETX.EXCELXP : EMBEDDED_TITLES etEMBEDDED_FOOTNOTES.

1. Le code

Voici le code pour l’exemple. Vous noterez que j’ai rajouté une instruction ODS… juste après les instructions TITLE et FOOTNOTE. Cela permet à SAS de mettre à jour les titres et pieds-de-page qu’il a en mémoire. Cela sera pratique lorsque vous aurez plusieurs feuilles de calculs avec des titres différents. Autrement, vous pouvez ajouter les instructions TITLE et FOOTNOTES avant la première instruction ODS TAGSETS.EXCELXP.

ods listing close;
ods tagsets.excelxp file=‘C:/sasref/class.xls’
options(embedded_titles=‘yes’
embedded_footnotes=‘yes’);

title ‘Titre’;
footnote ‘Pied’;
ods tagsets.excelxp;

proc report data=sashelp.class nowd;
columns name age;
define name/display ‘Nom’;
define age /display ‘Age’;
run;

ods tagsets.excelxp close;
ods listing;

L’option NOWD est propre à un environnement Windows. Cela évite l’ouverture de la fenêtre REPORT

2. Voir le résultat

Résultat ods tagsets.excelxp options embedded_titles embedded_footnotes

3. Enlever les lignes blanches entre les titres/pieds-de-page et la table

Pour empêcher l’insertion d’une ligne entre le(s) titre(s) et la table, le(s) pied(s)-de-page et la table, il faut faire appel à l’option SKIP_SPACE=.

Avant d’aller plus loin, il faut noter que

  • la ligne d’espace entre le titre est la table est lié au TITRE et
  • la ligne entre la table et le pied-de-page est lié à la TABLE et non au pied-de-page.

Cette option de l’instruction ODS TAGSETS.EXCELXP est composée de 5 nombres.

  • Le premier nombre fait référence à la TABLE
  • Le 3ème nombre est lié au TITRE
  • Le 4ème nombre fait référence au PIED-DE-PAGE.

Par défaut SKIP_SPACE=’1,0,1,1,1′.

Pour ôter les lignes séparant la table des titres et pieds-de-page, on aura : SKIP_SPACE=’0,0,0,1,1′. On enlevera la ligne après la table avec le premier zéro et la ligne après le titre avec le troisième zéro.

01_xls_title_extra

A venir

Je vous propose de découvrir dans les deux articles à venir des compléments sur les titres et pieds-de-page avec ODS TAGSETS.EXCELXP :

  • Créer un style pour personnaliser les couleurs, polices des titres/pieds-de-page avec un PROC TEMPLATE.
  • Utiliser un titre plus grand que la largeur donnée par les colonnes du tableau

Lectures complémentaires

h1

Mettre à jour ses TAGSETS pour EXCELXP

juin 4, 2009

Créer un fichier XML ouvrable avec Excel est possible avec l’ODS TAGSETS.EXCELXP de SAS. Il est important de disposer des dernière mises à jour des tagsets de EXCELXP pour utiliser son potentiel. Quelle version utilisez-vous actuellement ? Comment faire la mise à jour ?

1. Quelle version de TAGSETS.EXCELXP utilisez-vous ?

Pour connaître la version de TAGSETS.EXCELXP que vous utilisez, consultez la log après avoir exécuté ce PROC TEMPLATE.

proc template;
source tagsets.excelxp;
run;

2.  Comment faire les mises à jour ?

Allez sur la page http://support.sas.com/rnd/base/ods/odsmarkup/ pour trouver le code à exécuter dans SAS.

Par exemple, pour la mise à jour 1.86 (15 avril 2008), copiez dans votre éditeur SAS le code http://support.sas.com/rnd/base/ods/odsmarkup/excltags.tpl et exécutez-le.

En soumettant une nouvelle fois la procédure PROC TEMPLATE, la log nous indique que la version 1.86 est celle actuellement en place.

tagsets_version_v1_86

h1

En-tête et pied de page avec TAGSETS.EXCELXP

juin 1, 2009

La syntaxe de l’ODS TAGSETS.EXCELXP permet de créer sous SAS un fichier lisible par Excel. Pour vous familiariser avec cette syntaxe, je vous invite à lire les articles : Mes premiers pas avec ODS TAGSETS.EXCELXP, partie 1, partie 2 et partie 3.

Deux options servent à ajouter une en-tête et un pied de page au fichier à imprimer : print_header et print_footer.

Sous Excel 2003, cela correspond aux écrans suivants :

excelp_header

excelp_footer

1. La syntaxe de base

Ici le fichier HEADER_FOOTER.xls est créé au moyen de l’instruction ODS TAGSETS.EXCELXP. La feuille de calcul s’appelle « Exemple ». Les options PRINT_HEADER et PRINT_FOOTER sont encore à définir.

Le fichier contient les informations de la table CLASS contenue dans la bibliothèque SASHELP.

ods listing close;
ods tagsets.excelxp file=‘c:/sasref/header_footer.xls’
options(sheet_name=‘Exemple’
print_header=‘à définir’
print_footer=‘à définir’);
proc print data=sashelp.class;
run;
ods tagsets.excelxp close;
ods listing;

ODS LISTING : L’instruction ODS LISTING CLOSE, en début de programme, stoppe la création d’une sortie dans la fenêtre OUTPUT. L’instruction ODS LISTING réactive la destination LISTING.

Comme la syntaxe de PRINT_HEADER est la même que celle de PRINT_FOOTER, nous nous concentrons ici sur un seul d’entre eux dans les explications qui suivent : PRINT_FOOTER.

2. Avec la version 2003 d’Excel

Alignement : par défaut le texte est centré.

  • &amp;L : Aligner à gauche (left)
  • &amp;C : Centrer (center)
  • &amp;R : Aligner à droite (right)

Passage à la ligne

  • & #13; : Passer à la ligne (ne pas mettre d’espace entre & et #)

Le nom du fichier et de la feuille de calcul

  • &amp;Z : chemin d’accès au fichier
  • &amp;F : nom du fichier
  • &amp;A : nom de la feuille de calcul

Date et heure

  • &amp;D : date
  • &amp;T : heure

Police de styles

  • &amp;&quot;ma police&quot; mon texte :  introduit la police (Century Gothic, gras, italique ici)
  • &amp;12 :  introduit une taille du texte (12pt ici)
  • &amp; : clos la zone concernée par la police de styles

Le numéro de page

  • &amp;P : numéro de la page
  • &amp;N : nombre total de pages

Exemple : dans l’exemple qui suit, deux lignes de texte à gauche, une ligne au milieu et une à droite.

  • A gauche se trouve le chemin complet d’accès au fichier ainsi que le nom de la feuille de calcul  (C:/sasref/header_footer.xls, Exemple)
  • Toujours à gauche, sur la deuxième ligne est ajouté la date et l’heure
  • Au centre, est noté http://www.sasreference.fr en gras, italique avec un style Century Gothic de taille 12.
  • A droite, est ajouté le numéro de la page et le nombre total de pages (1/1).

&amp;L&amp;Z&amp;F.xls, &amp;A
& #13;&amp;D&amp;T
&amp;C&amp;&quot;Century Gothic,Bold Italic&quot;&amp;12www.sasreference.fr&amp;
&amp;R&amp;P/&amp;N

3. Avec la version d’Excel 2007

Alignement

  • &L : aligner à gauche
  • &R : aligner à droite
  • Le texte à centrer est mis en premier car le texte est centré par défaut.

Passage à la ligne

  • & #13; (comme avec Excel 2003)

Le nom du fichier et de la feuille de calcul

  • &P : chemin d’accès au fichier
  • &N : nom du fichier
  • &B : nom de la feuille de calcul

Date et heure

  • &D : date
  • &U<7span> : heure

Police de style (comme avec Excel 2003)

  • &amp;&quot;….&quot; :  introduit la police (Century Gothic, gras, italique ici)
  • &amp;12 :  introduit une taille du texte (12pt ici)
  • &amp; : clos la zone concernée

Vous pouvez aussi utiliser simplement &F pour mettre un texte en gras.

Le numéro de page

  • &S : numéro de la page
  • &A : nombre total de pages

Exemple :

  • &Fwww.sasreference.fr
  • &L&P&N.xls, &B
  • & #13;&D &U
  • &R&S/&A

Conclusion

La syntaxe reste difficilement mémorisable. Mais une fois celle-ci créée, il est possible de faire des copier/coller sans soucis particulier.

Pour chaque nouvelle feuille de calcul, l’option doit être définie. Ici, aucune proposition n’est faite pour définir de manière globale les en-têtes et pieds de page.

La syntaxe pour ajouter une image n’est pas donnée ici.

Le plus gros problème reste que la syntaxe varie selon la version d’Excel utilisée comme le confirme la note suivante de l’aide en ligne du tagset ExcelXP pour PRINT_HEADER ne donne pas toujours la bonne syntaxe.

h1

Numéroter ses pages avec ODS RTF

janvier 29, 2009

La syntaxe de ODS RTF a pour but de créer des fichiers ayant une extension .rtf lisible par Word notamment. Comment faire apparaître les numéros de pages en haut ou en bas de la page ? Comment faire pour ajouter des titres à vos tableaux par exemple quand les instructions TITLE et FOOTNOTE servent à la numérotation ?

1. Créer un document RTF

Stopper temporairement l’envoi vers la fenêtre OUTPUT : Dans un premier temps, la destination LISTING est désactivée. Elle est réactivée à la fin. En effet, par défaut le résultat d’un PROC PRINT est envoyé dans la fenêtre OUTPUT de SAS, fenêtre communément appelée LISTING en ODS.

Ouvrir et refermer le fichier RTF : la première instruction ODS RTF sert à définir le nom du fichier RTF à créer. Ici le fichier s’appelle NUMEROTATION.RTF et sera sauvegardé dans le répertoire SASREF du disque C. Toutes les impressions qui suivent (les deux PROC PRINT) seront inclues dans le document RTF. La dernière instruction ODS RTF indique la fermeture du fichier RTF. Plus aucune information ne sera ajoutée au fichier jusqu’à nouvel ordre.

Ajouter un en-tête : Une instruction TITLE située juste avant la première instruction ODS RTF ajoute une en-tête composée de deux parties :

  • Le centrage, l’alignement (justification) par défaut : Mon EN-TETE est centrée (center en américain)
  • Aligner à droite (right) : Page X/XX est affichée à droite de la page grâce à l’option qui la précède J. `

Par la suite X/XX seront remplacés par des numéros de page.

En effet par défaut les titres (title) et pieds de page (footnote) ne sont pas affichés dans le corps du document aux extrémités.

ods listing close;
title 'Mon EN-TETE' j=r 'Page x/xx';
ods rtf file='C:/sasref/numerotation.rtf';
proc print data=sashelp.class;
run;
proc print data=sashelp.class;
run;
ods rtf close;
ods listing;

2. Ajouter des numéros de page

A présent, deux petits ajouts sont fait.

Définir un symbole avec ODS ESCAPECHAR : Le symbole ^ servira de caractère pour introduire des mots-clés, comme l’indique l’instruction ODS ESCAPECHAR. Vous pouvez choisir le symbole de votre choix. La seule règle à respecter est de prendre un symbole qui n’a pas besoin d’être affiché dans le titre.

Afficher la page actuelle et le nombre total de page avec THISPAGE et LASTPAGE : dans l’instruction TITLE, les mots-clés THISPAGE et LASTPAGE doivent être englobés dans des accolades précédé de notre symbole ^ précédemment défini. SAS se chargera alors de les mettre à jour pour chaque page de votre document RTF.

Entre les deux numéros, la barre inclinée (slash) délimite le numéro de la page actuelle de celui de la dernière page. Vous être bien sûr libre d’ajouter le texte de votre choix entre les deux. De même, vous n´êtes pas obligé de faire précédé la numérotation du mot PAGE.

ods listing close;
ods escapechar='^';
title 'Mon EN-TETE' j=r 'Page ^{thispage}/^{lastpage}';
ods rtf file='C:/sasref/numerotation.rtf';
proc print data=sashelp.class;
run;
proc print data=sashelp.class;
run;
ods rtf close;
ods listing;

3. Ajouter des titres à mes différents tableaux

ODS RTF TEXT= : Maintenant que les options TITLE et FOOTNOTES servent pour les en-tête et pied de page, il faut trouver une alternative pour ajouter des titres à vos tableaux et graphiques. L’ODS RTF TEXT= se charge du travail.

La base, un exemple avec le titre du premier tableau : dans le premier exemple, on voit que l’instruction ODS RTF TEXT= contient entre guillemets ^S= suivi de deux accolades. De nouveau le symbole ^ est celui défini dans ODS ESCAPECHAR.

  • La première accolade contiendra des informations de mise en forme du texte.
  • La seconde accolade contiendra le titre.

Quelques options pour améliorer la mise en forme, un exemple avec le second titre : dans le second cas, on précise que

  • Le texte est à centrer horizontalement (JUST=C) et verticalement (VJUST=C).
  • Le texte sera afficher dans un emplacement de 3 cm de haut (OUTPUTHEIGHT=3cm) et cet emplacement prendra la totalité de la largeur de la page (OUTPUTWIDTH=100%).
  • Enfin le texte aura une taille de 18pt (FONT_SIZE=18pt).
ods listing close;
ods escapechar='^';
title 'Mon EN-TETE' j=r 'Page ^{thispage}/^{lastpage}';
ods rtf file='C:/sasref/numerotation.rtf';
proc print data=sashelp.class;
run;
ods rtf text='^S={}{Tableau 1}';
proc print data=sashelp.class;
run;
ods rtf text='^S={just=c vjust=c outputheight=3cm outputwidth=100% font_size=18pt}{Tableau 2}';
ods rtf close;
ods listing;

Poursuivre votre lecture : Trois articles sur l’ODS RTF

h1

Combien de contrats ai-je au total ? (5/5) PROC TABULATE

novembre 24, 2008

Ce dernier article de notre série sur le calcul d’un total par variable (contrat) sous SAS aborde la procédure PROC TABULATE. Comme précédemment, les résultats sont redirigés vers un data set.

1. Rappel

La source de la thématique : Cette série d’articles est basée sur une question posée sur le forum de http://www.commentcamarche.net : vous pouvez retrouver la question d’origine sur leur site.

Les autres articles : Vous pouvez retrouver les précédents articles de la série ici :

Les données :Les données sont sauvegardées dans un data set nommé CONTRATS. Il contient 4 variables :

  • l’identifiant de chaque client CLIENT,
  • le nombre de contrats NB_CNTR et
  • deux variables binaires TEL et HABITAT indiquant si oui ou non les fréquences s’appliquent.

Au total, on compte 9 contrats téléphoniques et 5 contrats d’habitation.

Créer le data set CONTRATS

data contrats;
   input client $ nb_cntr tel habitat;
   datalines;
a 5 1 0
b 1 1 0
c 2 0 1
d 1 1 0
e 3 0 1
f 2 1 0
;
run;

2. La réponse de PROC TABULATE

Lister les variables dans l’instruction VAR : Dans un premier temps les variables binaires TEL et HABITAT sont listées. Là encore il faut préciser le poids de chaque valeur. L’option WEIGHT introduit la variable NB_CONTR, notre coefficient multiplicateur.

Exprimer le calcul requis dans l’instruction TABLE : Pour chacune des variables TEL et HABITAT, la somme est faite en tenant compte du coefficient. Les résultats sont des nombres entiers mais SAS ajoute par défaut des chiffres après la virgule (des zéros donc ici). Pour s’en débarasser, un format 5. est appliqué aux sommes. La sonne ne devra donc pas être un nombre avec plus de 5 chiffres.

Empêcher l’affichage dans la fenêtre OUTPUT : La sortie générée par PROC TABULATE s’appelle TABLE. Par défaut, le résultat est envoyé dans la fenêtre OUTPUT. Pour empêcher cette redirection le temps du PROC TABULATE, les options ODS EXCLUDE doivent être activées.

Rediriger ses résultats dans un data set avec l’ODS (Output Delivery System) : Le data set contenant les résultats s’appelle SOLUTION5. Il est créé avec l’instruction ODS OUTPUT.

*ods exclude table;
proc tabulate data=contrats;*out=solution5;
   var tel habitat / weight=nb_cntr;
   table tel habitat, (sum='Frequency')*f=5.;
   ods output table=solution5;
run;
*ods exclude none;

L’ancienne méthode pour créer un data set, l’option OUT= : L’ancienne méthodeconsiste à ajouter l’option OUT= dans l’instruction PROC TABULATE. Mais cette syntaxe n’est pas généralisable à toutes les procédures et est donc plus difficile à se souvenir pour des utilisations occasionnelles.

3. Améliorer le fichier de sortie

Un simple PROC PRINT sur le fichier SOLUTION5 montre que

_TYPE_ _PAGE_ _TABLE_ tel_Sum habitat_Sum

   0      1      1        9       5

Pour changer l’orientation des résultats, vous pouvez faire appel à un PROC TRANSPOSE.

proc transpose data=solution5 out=solution5 (drop=_LABEL_);
   var tel_sum habitat_sum;
run;

Reste à vous d’améliorer la présentation avec des RENAME, LABEL appropriés, etc.

  _NAME_     COL1
tel_Sum       9
habitat_Sum   5
h1

Un texte de 32 767 caractères passé au crible

septembre 1, 2008

La quantité d’espace alloué pour une observation dans un data set SAS peut aller jusqu’à 32 767 octets (byte en anglais). Pour m’amuser, j’ai voulu tester. Pour ce faire, j’ai procédé en trois étapes :

  • J’ai créé une variable de 32 767 caractères et j’ai imprimé sa seule valeur dans un fichier .TXT.
  • Puis, j’ai voulu voir comment se déroulait le passage de 32 767 caractères d’un fichier .TXT dans une seule observation d’un data set SAS.
  • Enfin, pour visualiser le tout, j’ai imprimé cette observation dans un fichier .RTF.

Note : La longueur (length) est le mot utilisé en SAS pour parler de la quantité d’espace alloué à une observation. Seules les variables de type caractères (character) peuvent avoir jusqu’à 32 767 octets. Les variables numériques en ont, en effet, 8 au maximum.  Un octet permet de stocker un caractère d’une variable texte. Pour plus de précisions sur l’octet, reportez-vous à l’article « 9 points autour de la notion d’octet« .

Note : La longueur allouée est identique pour toutes les observations d’une même variable. Si la longueur de la variable n’est pas explicitement donné, SAS utilise la longueur de la première observation. Avec un input file, seuls 8 octets sont attribués (SAS Online Doc. : SAS Variable Attributes »). 

data one;
   input x $;
   datalines;
ABC
ABCDEFGHIJKLMN
;
run;

data two;
   x=‘ABC’;
   output;
   x=‘ABCDEFGHIJKLMN’;
   output;
run;

data three;
x=‘ABCDEFGHIJKLMN’;
output;
x=‘ABC’;
output;
run;

Dans le premier exemple, la longueur sera de 8. La seconde observation sera donc coupée.

ABC
ABCDEFGH

Dans le second exemple, la longueur est définie par la première observation. Il s’agit donc d’une longueur de 3. La seconde observation est coupée et ne garde que les trois premiers caractères.

ABC
ABC

Dans le troisème exemple, la longueur est également définie par la première observation. Elle est donc cette fois de 14. Aucune des deux observations n’est coupée.

ABCDEFGHIJKLMN
ABCDEFGHIJKLMN

Cette valeur est changeable. Il s’agit de modifier l’attribut LENGTH d’une variable donnée dans un data step. La valeur est définie soit à l’instruction LENGTH, soit à l’instruction ATTRIB.

1. Imprimer 32 767 caractères dans un fichier .TXT

Dans l’exemple ci-dessous, un fichier .TXT est créé. Il contient 32 767 caractères venant d’une seule et même observation.

Une instruction LENGTH définissant le type et la longueur de la variable : Dans cet exemple, une variable TEST_VAR est créée. Il s’agit d’une variable caractère. Une longueur de 32 767 lui est assignée avec l’instruction LENGTH. Elle pourra donc contenir jusqu’à 32 767 octets par record.

Taper plus de 32 000 caractères, c’est long mais il y a la fonction REPEAT pour nous sauver : La valeur prise par le premier record de la variable TEST_VAR est donnée. J’ai choisi de répéter la lettre a 32 766 fois. Je dis bien 32 766 fois et non 32 765 fois car la fonction REPEAT ajoute à la valeur initiale ‘a’ 32 765 autres ‘a’, soit 32 765 + 1.

Ajouter un dernier caractère à notre valeur : A ces 32 766 lettres ‘a’, j’ai ajouté la lettre ‘b’ en faisant une concaténation grâce aux deux barres verticales. De cette manière, il sera possible de visualiser l’absence de coupure faite par SAS.

filename lgth_max ‘C:/sasref/lgth_max.txt’;
data _null_;
   file lgth_max;
   length test_var $ 32767;
   test_var=repeat(‘a’,32765)||‘b’;
   put test_var;
run;

filename lgth_max clear;

Ecrire le contenu de la variable dans un fichier externe : pour écrire les 32 767 caractères dans un fichier externe, SAS a besoin de trois instructions.

  • Ecrire du texte avec l’instruction PUT : L’instruction PUT est exécutée pour chaque observation de la variable TEST_VAR, c’est-à-dire une fois dans notre cas.
  • Diriger un texte vers une autre destination que la log avec l’instruction FILE : La valeur prise par la variable TEST_VAR est écrite dans un autre fichier. Cet autre fichier est désigné de manière indirecte dans l’instruction FILE. Je dis de manière indirecte car seul un nom figure dans l’instruction FILE, un nom désignant un fichier préalablement défini. On parle de FILEREF.
  • Caractériser un fichier de destination avec l’instruction FILENAME : Le FILEREF désignant la destination du texte à imprimer est défini dans l’instruction FILENAME. A la fin du programme, ce nom servant d’intermédiaire est supprimé pour pouvoir resservir et ainsi désigner un autre fichier ou chemin d’accès.

Pas besoin de créer un data set SAS ici : Dans le cas présent, nous avons besoin d’une étape DATA pour exécuter ce code mais nous n’avons pas besoin de créer un data set. Pour épargner la tâche de création d’un data set, le nom _NULL_ remplace le nom d’un data set.

2. Créer un data set SAS

Lire les données contenues dans un fichier externe : Une variable TEST_NEW est créée dans un data set nommé TEST_DS. Elle est de type caractère comme l’indique le symbole dollar ($) présent dans l’instruction INPUT.

Avant d’entrer une valeur dans cette variable, la longueur maximale autorisée est définie dans l’instruction LENGTH. Comme il s’agit d’une variable caractère, il faut ajouter le dollar.

Au lieu de saisir manuellement les valeurs dans le data step en introduisant le mot DATALINES, une instruction INFILE désigne le fichier où sont stockées les données.

data test_ds;
   infile ‘C:/sasref/lgth_max.txt’;
   length test_new $ 32767;
   input test_new $;
run;

Vérifier la valeur prise par l’attribut LENGTH de la variable TEST_NEW :  La procédure PROC CONTENTS donnera un aperçu des caractéristiques des variables du data set TEST. Bref, cette procédure donnera accès aux méta données (metadata ou données sur les données). Cela comprend la longueur allouée à la variable TEST_NEW et le type de la variable (caractère dans ce cas précis).

proc contents data=test_ds;
run;

3. Visualiser le data set dans un fichier .RTF

Seuls les 128 premiers caractères sont imprimables dans la fenêtre OUTPUT. Par contre, vous pouvez envisager d’autres destinations comme un fichier .RTF. Dans l’exemple, on joue avec les instructions ODS (Output Delivery System).

  • D’une part, la redirection vers la fenêtre output est stoppée le temps de l’impression, via les instructions ODS LISTING.
  • D’autre part, les 32 767 caractères sont envoyés dans un fichier .RTF grâce aux instructions ODS RTF.

ods listing close;
ods rtf file=‘C:/sasref/lgth_max.rtf’;
proc print data=test_ds;
run;
ods rtf close;
ods listing;

Pours les curieux : Changez la longueur pour 32 768 et expérimentez en direct les limites de SAS.