Les exemples utilisent des données générées (datalines) ou des créations directes de tables CAS via des étapes DATA.
1 Bloc de code
DATA STEP Data
Explication : Cet exemple initialise deux variables, une VARCHAR et une CHAR, avec des chaînes de caractères mono-octets. La fonction INDEX recherche la position du caractère 'c'. Comme les caractères sont mono-octets, les positions retournées sont identiques (3), quel que soit le type de variable, illustrant le comportement standard.
Copié !
libname mycas cas;
data mycas.chaine_basique;
length x varchar(10);
length y $10;
x = 'abcde';
y = 'abcde';
xi = index(x,'c');
yi = index(y,'c');
put 'VARC_pos_c = ' xi;
put 'CHAR_pos_c = ' yi;
run;
proc print data=mycas.chaine_basique;
title 'Résultats de l''indexation basique';
run;
proc casutil incaslib='mycas' outcaslib='mycas';
dropcas casdata='chaine_basique' quiet;
quit;
1
LIBNAME mycas cas;
2
3
DATA mycas.chaine_basique;
4
LENGTH x varchar(10);
5
LENGTH y $10;
6
x = 'abcde';
7
y = 'abcde';
8
xi = index(x,'c');
9
yi = index(y,'c');
10
put 'VARC_pos_c = ' xi;
11
put 'CHAR_pos_c = ' yi;
12
RUN;
13
14
PROC PRINTDATA=mycas.chaine_basique;
15
title 'Résultats de l''indexation basique';
16
RUN;
17
18
PROC CASUTIL incaslib='mycas' outcaslib='mycas';
19
dropcas casdata='chaine_basique' quiet;
20
QUIT;
2 Bloc de code
DATA STEP Data
Explication : Cet exemple utilise des caractères chinois multi-octets. La variable VARCHAR(10) stocke '你好世界' comme 4 caractères. La recherche de '世' (le troisième caractère) retourne 3 pour VARCHAR. La variable CHAR(10) stocke la même chaîne, mais chaque caractère occupe 3 octets. La recherche de '世' (le 7ème octet si on compte à partir de 1) retourne 7 pour CHAR, démontrant clairement la différence entre la sémantique par caractère (VARCHAR) et par octet (CHAR).
Copié !
libname mycas cas;
data mycas.chaine_multioctet;
length x varchar(10);
length y $10;
x = '你好世界'; /* "Bonjour monde" en chinois, 4 caractères, 12 octets */
y = '你好世界';
xi = index(x,'世'); /* Recherche du 3ème caractère */
yi = index(y,'世');
put 'VARCHAR_pos_shi = ' xi;
put 'CHAR_pos_shi = ' yi;
run;
proc print data=mycas.chaine_multioctet;
title 'Résultats de l''indexation multi-octets';
run;
proc casutil incaslib='mycas' outcaslib='mycas';
dropcas casdata='chaine_multioctet' quiet;
quit;
1
LIBNAME mycas cas;
2
3
DATA mycas.chaine_multioctet;
4
LENGTH x varchar(10);
5
LENGTH y $10;
6
x = '你好世界'; /* "Bonjour monde" en chinois, 4 caractères, 12 octets */
7
y = '你好世界';
8
xi = index(x,'世'); /* Recherche du 3ème caractère */
9
yi = index(y,'世');
10
put 'VARCHAR_pos_shi = ' xi;
11
put 'CHAR_pos_shi = ' yi;
12
RUN;
13
14
PROC PRINTDATA=mycas.chaine_multioctet;
15
title 'Résultats de l''indexation multi-octets';
16
RUN;
17
18
PROC CASUTIL incaslib='mycas' outcaslib='mycas';
19
dropcas casdata='chaine_multioctet' quiet;
20
QUIT;
3 Bloc de code
DATA STEP Data
Explication : Cet exemple approfondit l'utilisation de INDEX en recherchant une sous-chaîne plus longue ('monde') dans des variables CHAR et VARCHAR. Il montre que pour des caractères mono-octets, le comportement est le même. De plus, il illustre ce qui se passe lorsque la sous-chaîne recherchée n'est pas trouvée (la fonction INDEX retourne 0), un cas courant dans la manipulation de chaînes.
Copié !
libname mycas cas;
data mycas.chaine_avancee;
length phrase_varchar varchar(50);
length phrase_char $50;
phrase_varchar = 'Le monde est beau, la vie est courte.';
phrase_char = 'Le monde est beau, la vie est courte.';
pos_monde_varchar = index(phrase_varchar,'monde');
pos_monde_char = index(phrase_char,'monde');
pos_non_trouve_varchar = index(phrase_varchar,'inexistant');
pos_non_trouve_char = index(phrase_char,'inexistant');
put 'VARCHAR "monde" à la position : ' pos_monde_varchar;
put 'CHAR "monde" à la position : ' pos_monde_char;
put 'VARCHAR "inexistant" à la position : ' pos_non_trouve_varchar;
put 'CHAR "inexistant" à la position : ' pos_non_trouve_char;
run;
proc print data=mycas.chaine_avancee;
title 'Résultats de recherche avancée de sous-chaînes';
run;
proc casutil incaslib='mycas' outcaslib='mycas';
dropcas casdata='chaine_avancee' quiet;
quit;
1
LIBNAME mycas cas;
2
3
DATA mycas.chaine_avancee;
4
LENGTH phrase_varchar varchar(50);
5
LENGTH phrase_char $50;
6
phrase_varchar = 'Le monde est beau, la vie est courte.';
7
phrase_char = 'Le monde est beau, la vie est courte.';
put 'VARCHAR "monde" à la position : ' pos_monde_varchar;
16
put 'CHAR "monde" à la position : ' pos_monde_char;
17
put 'VARCHAR "inexistant" à la position : ' pos_non_trouve_varchar;
18
put 'CHAR "inexistant" à la position : ' pos_non_trouve_char;
19
RUN;
20
21
PROC PRINTDATA=mycas.chaine_avancee;
22
title 'Résultats de recherche avancée de sous-chaînes';
23
RUN;
24
25
PROC CASUTIL incaslib='mycas' outcaslib='mycas';
26
dropcas casdata='chaine_avancee' quiet;
27
QUIT;
4 Bloc de code
DATA STEP Data
Explication : Cet exemple met en évidence la sémantique de longueur en utilisant la fonction SUBSTR en environnement CAS, un élément clé de Viya. Il utilise des caractères multi-octets et montre que SUBSTR sur VARCHAR extrait des caractères en fonction de leur position logique (par caractère), tandis que sur CHAR, il extrait des octets. Cela peut entraîner des résultats inattendus si la différence n'est pas comprise, notamment si l'on tente d'extraire des parties de caractères multi-octets avec une variable CHAR. Cela peut également être source d'erreur si la position indiquée est au milieu d'un caractère multi-octets pour une variable CHAR, ou au-delà de la taille définie si l'on ne prend pas en compte la sémantique.
Copié !
libname mycas cas;
data mycas.chaine_substr_cas;
length var_char $10;
length var_varchar varchar(10);
/* Chaîne de 3 caractères multi-octets (ex: chinois) */
var_char = '你好世'; /* 3 caractères, 9 octets */
var_varchar = '你好世';
/* Extraction du 2ème caractère (VARCHAR) vs 2ème octet (CHAR) */
sub_varchar_char = substr(var_varchar, 2, 1);
sub_char_byte = substr(var_char, 2, 1);
/* Tentative d'extraction d'un caractère au-delà de la longueur réelle par octet pour CHAR */
sub_char_byte_erreur = substr(var_char, 7, 1); /* Le 7ème octet est le 3ème caractère */
put 'VARCHAR (caractère 2) : ' sub_varchar_char;
put 'CHAR (octet 2) : ' sub_char_byte;
put 'CHAR (octet 7, 3ème caractère) : ' sub_char_byte_erreur;
run;
proc print data=mycas.chaine_substr_cas;
title 'Comparaison SUBSTR avec CHAR et VARCHAR en CAS';
run;
proc casutil incaslib='mycas' outcaslib='mycas';
dropcas casdata='chaine_substr_cas' quiet;
quit;
1
LIBNAME mycas cas;
2
3
DATA mycas.chaine_substr_cas;
4
LENGTH var_char $10;
5
LENGTH var_varchar varchar(10);
6
7
/* Chaîne de 3 caractères multi-octets (ex: chinois) */
8
var_char = '你好世'; /* 3 caractères, 9 octets */
9
var_varchar = '你好世';
10
11
/* Extraction du 2ème caractère (VARCHAR) vs 2ème octet (CHAR) */
12
sub_varchar_char = substr(var_varchar, 2, 1);
13
sub_char_byte = substr(var_char, 2, 1);
14
15
/* Tentative d'extraction d'un caractère au-delà de la longueur réelle par octet pour CHAR */
16
sub_char_byte_erreur = substr(var_char, 7, 1); /* Le 7ème octet est le 3ème caractère */
17
18
put 'VARCHAR (caractère 2) : ' sub_varchar_char;
19
put 'CHAR (octet 2) : ' sub_char_byte;
20
put 'CHAR (octet 7, 3ème caractère) : ' sub_char_byte_erreur;
21
RUN;
22
23
PROC PRINTDATA=mycas.chaine_substr_cas;
24
title 'Comparaison SUBSTR avec CHAR et VARCHAR en CAS';
25
RUN;
26
27
PROC CASUTIL incaslib='mycas' outcaslib='mycas';
28
dropcas casdata='chaine_substr_cas' quiet;
29
QUIT;
Ce matériel est fourni "tel quel" par We Are Cas. Il n'y a aucune garantie, expresse ou implicite, quant à la qualité marchande ou à l'adéquation à un usage particulier concernant le matériel ou le code contenu dans les présentes. We Are Cas n'est pas responsable des erreurs dans ce matériel tel qu'il existe maintenant ou existera, et We Are Cas ne fournit pas de support technique pour celui-ci.
SAS et tous les autres noms de produits ou de services de SAS Institute Inc. sont des marques déposées ou des marques de commerce de SAS Institute Inc. aux États-Unis et dans d'autres pays. ® indique un enregistrement aux États-Unis. WeAreCAS est un site communautaire indépendant et n'est pas affilié à SAS Institute Inc.
Ce site utilise des cookies techniques et analytiques pour améliorer votre expérience.
En savoir plus.