Posts Tagged ‘hexadecimal’

h1

Ces caractères hexadécimaux non visibles au 1er coup d’oeil

novembre 23, 2009

Lors de l’importation de données d’un fichier Excel, il est fréquent d’importer au passage des caractères spéciaux non visible au premier coup d’œil. Par exemple, on peut trouver des blancs représentés en valeur hexadécimale par le code 20. Certains de ses caractères ressemblent à des blancs mais n’en sont pas. Ils ne disparaîtront donc pas avec une fonction COMPRESS sans troisième paramètre. La valeur hexadécimale de ces caractères est par contre une valeur lisible.

Voici comment afficher votre texte en valeur hexadécimale et ce dans la log ?

1. Illustration du problème

Dans cet exemple, une variable WEBISTE de longueur 25 est présente dans la table HEXFMT. Cette variable contient une observation http://www.sasreference.fr entourée d’un blanc avant et d’un blanc après. Cette valeur est créée ici au moyen de la fonction CAT.

Pour voir la différence entre la valeur de WEBSITE avec et sans un simple COMPRESS, une seconde variable EQUAL indique la valeur YES si les deux résultats sont identiques, NO sinon.

data hexfmt;
length website $25 equal $3;
website=cat(’20’x,‘www.sasreference.fr’,’20’x);
if website=compress(website) then equal=‘Yes’;
else equal=‘No’;
run;

proc print data=hexfmt;
run;

2. Voir les caractères hexadécimaux avec le format HEX

Ici, je vous propose de voir la valeur de la variable WEBSITE au moyen de l’instruction PUT. Il est possible de voir la valeur formatée plutôt que la valeur brute en faisant suivre la variable d’un format. Le format ici sera HEXw. où w est un nombre idéalement de la longueur de la variable fois deux. En effet, les caractères hexadécimaux sont toujours de longueur deux. Si votre texte est de longueur 25, il faudra 50 caractères pour l’afficher en valeur hexadécimale.

data hexfmt;
length website $25;
website=cat(’20’x,‘www.sasreference.fr’,’20’x);
put website= hex50.;
run;

proc print data=hexfmt;
run;

Dans le résultat qui suit, on voit donc le premier caractère de l’observation de WEBSITE a pour code 20. Le second caractère est la lettre W représentée par le code 77, et ainsi de suite.

Lecture complémentaire

h1

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

février 23, 2009

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üe
  • 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éciaux 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

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

2. Un exemple, le symbole « Line Feed »

L’image ci-dessous présent une 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 la fonction 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;

Lectures complémentaires :

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;


				
h1

Ajouter des indentations dans un tableau

octobre 20, 2008

Avec PROC REPORT et PROC TABULATE, SAS crée des tableaux à partir d’un jeu de donnée (SAS data set). Dans certains cas, la lisibilité de ces tableaux est améliorée en ajoutant des indentations au texte (to indent). Nous verrons donc ici deux approches possibles : l’option INDENT de PROC TABULATE et le caractère hexadécimal pour les blancs dans PROC REPORT.

1. Un exemple pour illustrer la syntaxe sur les indentations

Dans les essais cliniques, trois types de tableaux/listings sont produits :

  • Démographie (demography) : descriptif des patients en terme d’âge, de sexe, de pays, etc.
  • Efficacité (efficacy) : l’efficacité du médicament par rapport à un autre ou par rapport à un effet placebo (le patient prend en médicament en pensant qu’il est actif alors qu’il ne l’est pas).
  • Sécurité (safety) : ces tableaux permettent l’analyse des effets secondaires d’un médicament.

Je vais prendre la cas d’un tableau démographique version réduite (trois colonnes) pour présenter la syntaxe sur les indentations.

  • La première colonne contient les caractéristiques démographiques (sexe et pays),
  • la seconde colonne compte le nombre de patients (N) pour chaque caractéristique
  • la troisième colonne donnera la répartition des patients en pourcentage (%).
---------------------------------
|                   |  N  |  %  |
|-------------------------------|
|Gender             |           |
|   Male            |   12| 48 %|
|   Female          |   13| 52 %|
|Country            |           |
|   France          |    6| 24 %|
|   Belgium         |   10| 40 %|
|   Luxemburg       |    9| 36 %|
---------------------------------

Des variables numériques pour ordonner les valeurs : Pour faciliter le tri des données, j’ai choisi d’avoir des variables numériques dans mon data set SAS sur lesquelles j’applique des formats.

  • Ainsi la premier variable (GRP) réfère à l’intitulé des caractéristiques démographiques : Gender (1) Country (2).
  • La seconde variable (SUBGRP) est l’ordre pour chaque caractéristique. J’aurais pu choisir des valeurs de 1 à 5 mais j’ai préféré que chaque chiffre des décimal corresponde à la variable GRP.
data patient_info;
   input grp subgrp cnt_n pct_n;
   datalines;
1 11 12 0.48
1 12 13 0.52
2 21  6 0.24
2 22 10 0.40
2 23  9 0.36
;
run;

Je choisi de créer des formats du même nom (GRP et SUBGRP) :

proc format;
   value grp     1='Gender'
                 2='Country';
   value subgrp 11='Male'
                12='Female'
                21='France'
                22='Belgium'
                23='Luxemburg';
run;

En outre, je crée un format avec PICTURE pour l’affichage des pourcentages. La raison est la suivante : par défaut, deux chiffres après la virgules apparaissent avec PROC TABULATE. De plus, je souhaite voir le symbole % s’afficher pour chaque pourcentage.

Un format BEST5. est ajouté pour des fréquences composées jusqu’à 5 chiffres sans décimale. De plus, il remplace les points par des blancs. Cela servira pour PROC REPORT.

proc format;
   picture pct (round) .     = ''
                       other = '099 %' (multiplier=100);
   value cnt           .     = ' '
                       other = [best5.];
run;

Dans les deux exemples qui suivent une indentation est formée de trois blancs.

2. L’option INDENT de PROC TABULATE

Dans l’exemple suivant, les deux variables GRP et SUBGRP sont traitées comme des variables textuelles.

L’instruction TABLE contient l’option INDENT= et précise ainsi le nombre de blancs pour décaler les valeurs de la variable SUBGRP vers la droite. Le résultat a été donné en début d’article.

proc tabulate data=patient_info noseps;
   class grp subgrp;
   table grp=''*subgrp='', cnt_n='N'*sum=' '*f=5.
                           pct_n='%'*sum=' '*f=pct.
         / rts=20 indent=3;
   format grp grp. subgrp subgrp.;
run;

Les options NO=SEPS et RTS= sont là pour personnaliser la mise en forme. Pour plus de précisions sur ces options, vous pouvez consulter la documentation en ligne :

  • NOSEPS sur la page « PROC TABULATE Statement »
  • RTS= sur la page « TABLE Statement »

3. Créer des variables alphanumériques (caractères) avec PROC REPORT

Ajouter une ligne pour chacune des caractéristiques : Toutes les informations sont créées manuellement. Ainsi, il y a en plus une ligne pour chaque groupe dans le data set SAS. Au lieu d’avoir 5 lignes, on en aura 7. Pour chaque nouveau GRP, la variable SUBGRP prendre la valeur du GRP + un zero afin d’apparaître en premier dans le rapport après un tri.

proc sort data = patient_info 
          out  = patient_report;
   by grp subgrp;
run;
data patient_report;
   set patient_report;
   by grp subgrp;
   output;
   if first.grp then
      do;
         subgrp=grp*10;
         cnt_n=.;
         pct_n=.;
      end;
run;

Trier par SUBGRP pour afficher les données dans l’ordre voulu.

proc sort data=patient_report;
   by grp subgrp;
run;

Une fois triées les données sont toujours numériques.

grp subgrp cnt_n pct_n

  1    10     .     .
  1    11    12  0.48
  1    12    13  0.52
  2    20     .     .
  2    21     6  0.24
  2    22    10  0.40
  2    23     9  0.36

Créer des variables caractères : la variable DSPLAY nouvellement créée peut contenir jusqu’à 15 caractères. Elle est composée des variables GRP et SUBGRP converties avec la fonction PUT.

Des hexadécimales pour créer des blancs : Les espaces sont créés à partir de valeurs hexadécimales. On répète ici trois fois A0 entre guillemets pour créer trois espaces. La lettre x qui suit précise à SAS qu’il s’agit d’hexadécimales. Ces trois blancs sont concaténés au résultat de la fonction PUT grâce aux deux barres.

data patient_report;
   length dsplay $15;
   set patient_report;
   if subgrp=0 then dsplay=put(grp,grp.);
   else dsplay='A0A0A0'x || put (subgrp,subgrp.);
   cnt_c=put(cnt_n,cnt.);
   pct_c=put(pct_n,pct.);
run;

Trier les données : La variable SUBGRP sert uniquement à définir l’ordre d’affichage des données mais n’apparaît pas dans le tableau final (option NOPRINT dans l’instruction DEFINE).

Enlever le titre de la colonne : La variable DSPLAY contient les caractéristiques démographiques. Aucun nom n’apparaîtra dans le titre de la colonne. Si les guillemets vides ne sont pas précisés, le nom de la variable est affiché.

Aligner à droite : Les variables caractères CNT_C et PCT_C sont affichées en tant que texte (DISPLAY) et leurs observations sont alignées à droite plutôt que d’être centrées (option RIGHT).

proc report data=patient_report;
   columns subgrp dsplay cnt_c pct_c;
   define subgrp / noprint order order=data;
   define dsplay / ' ' display;
   define cnt_c  / 'N' display right;
   define pct_c  / '%' display right;
run;

Dans ce cas, la sortie se présente sans ligne autour du cadre :

                     N      %
Gender
   Male             12   48 %
   Female           13   52 %
Country
   France            6   24 %
   Belgium          10   40 %
   Luxemburg         9   36 %

Sur le blog, vous trouverez d’autres articles sur les notions abordées ici :