Annonce

Bienvenue sur le site support des ouvrages :
SAS - Introduction au décisionnel : méthode et maîtrise du langage
(1ère édition - épuisée)
SAS - Introduction pratique : du data management au reporting (2ème édition - épuisée)
SAS - Introduction au décisionnel : du data management au reporting (3ème édition - épuisée (hélas...))

la réponse à la question "mais où trouver la 3ème édition ?" est précisée ici


Retrouvez dans ce tiré à part, la préface écrite par Mouloud Dey, Directeur Business solutions et marchés émergents, SAS France,
l’introduction générale ainsi que le plan complet de l’ouvrage

#1 14-02-2018 10:51:25

SAS-SR
Administrateur
Lieu: Université d'Orléans
Date d'inscription: 01-09-2008
Site web

SAS University Edition et le signe €

Les utilisateurs de SAS University Edition (SAS UE) ont un petit problème et nous allons tenter de le résoudre.

J'ai pas mal râlé à ce sujet dans la section dédiée à SAS UE : le codage par défaut avec SAS UE, c'est de l'UTF-8 (alors qu'avec un SAS "standard", c'est du WLATIN1) - il est impossible de modifier cela avec SAS UE.

Le codage ? c'est quoi ?

Les caractères que vous voyez dans les modalités de vos variables caractères sont, en réalité, une suite de 0 et de 1. Quand par exemple, vous voyez un A majuscule, en réalité, ce qui est stocké dans l'octet correspondant à ce A, c'est 01000001.

Le codage, c'est un fait une norme qui permet la transformation d'un caractère en une suite de 0 et de 1.

Le codage WLATIN (en fait Windows-1252 aussi appelé codage ANSI) est un codage SBCS (Single-Byte Character Set) : les caractères sont systématiquement enregistrés sur un octet. Bien entendu, avec 8 0/1, le nombre de caractères différents que vous allez pouvoir codé est limité : 2 puissance 8 = 256.

En fait, vous n'avez même pas 256 caractères possibles puisque certaines "combinaisons" sont réservés à des caractères de contrôle (comme la tabulation par exemple...). Si votre codage est la WLATIN1 et si vous tentez de faire entrer un caractère non géré par cette norme de codage, vous aurez un joli "?"

vous souhaitez un exemple ?

voici quelques idéogrammes japonnais (pris au hasard sur www.yahoo.co.jp) que l'on va tenter de faire entrer dans une variable caractère avec SAS lorsque le codage est WLATIN1 :

Code:

data test;
input texte $256. ;
cards;
警察犬が銃発見 組幹部
;run;

et voici le résultat :
http://www.sas-sr.com/img/jap.png

Évidemment, ce n'est pas très utile...

Prenez ce même programme et exécutez le avec SAS UE (norme de codage UTF-8), vous obtiendrez :

http://www.sas-sr.com/img/utfsue.png

Il existe donc d'autres normes de codage (comme l'UTF-8) qui vont vous permettre de coder un nombre nettement plus important de caractères.

Mais ce codage en UTF8 n'est pas sans poser quelques difficultés.. ainsi, l'INFORMAT EURO. ne fonctionnera pas si votre codage est UTF8 (et donc avec SAS UE).

La raison ? c'est très certainement dû au fait qu'en UTF-8, il faut 3 octets pour coder le signe € alors qu'avec un codage WLATIN1, il n'est faut qu'un.

Si vous disposez de SAS UE, tentez d'exécuter ce programme :

Code:

data test;
input x :euro. y;
cards;
€1 1
€2 2
€123.45 3
€1234.56 4
;

et vous verrez que ça ne marche pas...

Alors, puisque l'INFORMAT EUROw.d ne fonctionne pas avec SAS UE, comment faire pour malgré tout disposer dans la table TEST d'une variable numérique qui aura pour modalité 1, 2, 123.45 et 1234.56 ?

Même si vous ne disposez pas de SAS UE, amusez vous quand même avec ce petit exercice (très simple en réalité)...

à la semaine prochaine

Hors ligne

 

#2 21-02-2018 15:53:57

SAS-SR
Administrateur
Lieu: Université d'Orléans
Date d'inscription: 01-09-2008
Site web

Re: SAS University Edition et le signe €

vraiment pas compliqué le sujet de cette semaine...

Bref...

puisque le signe € pose des problèmes en raison du codage UTF-8, autant l'éviter... enregistrons déjà le champ contenant ce signe euro dans une variable caractère puis, utilisons la fonction INPUT avec l'INFORMAT "qui va bien" pour créer notre variable numérique (quand je vous disais que c'était simple !)

Code:

data test;
input temp :$25. y;
x=INPUT(KSUBSTR(temp,2),25.);
drop temp;
cards;
€1 1
€2 2
€123.45 3
€1234.56 4
;

trois petites remarques :

- utilisateur de SAS UE, n'oubliez pas d'être "généreux" dans les W des INFORMAT citées dans votre instruction INPUT. Avec le codage UTF-8, il n'y a plus de correspondance exacte entre le nombre d'octets attribué à une variable et le nombre de caractère que vous allez pouvoir stocker dans cette variable. Le caractère € nécessite 3 octets pour être codé dans une variable caractère et si vous utilisez un simple INFORMAT $, vous ne pourrez pas enregistrer un champ comme €1234.56. Il nécessite en effet 10 octets pour être intégralement saisie. Nous avons été généreux accordant à la variable TEMP 25 octets.

- en ce qui concerne la valeur du W de l'INFORMAT cité dans la fonction INPUT, donnez lui simplement la valeur du W de l'INFORMAT que vous avez utilisé dans l'instruction INPUT (à ce stade, mes étudiants doivent comprendre pourquoi je les tanne quand ils utilisent le mot fonction au lieu du mot instruction...)

- vous devez utiliser KSUBSTR au lieu de SUBSTR. Avec SUBSTR(temp,2), vous allez saisir le contenu de la variable TEMP à partir du second octet. Puisque votre signe € est codé sur 3 octets, le second et le troisième ne contiennent pas ce que vous espérez (1 et 2 pour la dernière modalité). KSUBSTR demande"autre chose" : avec KSUBSTR(temp,2), vous demandez à extraire à partir du deuxième caractère.

Dans le monde habituelle (codage en WLATIN1), il n'y a aucune différence entre l'approche "caractère" et l'approche "octet"" puisque tous les caractères sont codés sur un octet. Dans le monde UTF-8, ça n'est plus vrai et il devient important d'utiliser les fonctions K (dont KSUBSTR) fait partie.

Si ce problème vous intéresse (ou s'il vous concerne...), n'hésitez pas à consulter cette page de l'aide SAS

Ensuite, quelle que soit la forme de votre champs introduit par un signe €, vous vous en sortirez toujours au moyen de la petite manœuvre indiquée plus haut :

Code:

data test(DROP=t1-t3) ;
   INPUT t1 :$15. t2 :$15.  t3 :$15. ;
   x1=INPUT(KSUBSTR(t1,2),COMMAX15.);
   x2=INPUT(KSUBSTR(t2,2),COMMA15.);
   x3=INPUT(KSUBSTR(t3,2),NUMX15.);
   CARDS;
€1.234,00 €1,234.00 €1234,00
;

les INFORMAT COMMAXw. COMMAw. et NUMXw, eux, ne posent aucun problème avec SAS UE...

et voilà !

à la semaine prochaine pour une nouveau sujet des beaux mercredis

Hors ligne

 

Pied de page des forums

Propulsé par FluxBB
Traduction par FluxBB.fr
Flux RSS