Publié le :

Fonction INDEX avec chaînes CHAR et VARCHAR

Ce code est également disponible en : Deutsch English Español
En attente de validation
L'analyse fonctionnelle détaille comment la fonction INDEX se comporte différemment selon le type de variable (CHAR ou VARCHAR), notamment en présence de caractères multi-octets. Les variables VARCHAR utilisent une sémantique de longueur par caractères, où la position est calculée en unités de caractères, tandis que les variables CHAR utilisent une sémantique de longueur par octets, où la position est calculée en octets. Ceci est crucial pour le traitement des données dans les environnements SAS© Viya et CAS, où la distinction peut affecter les résultats des fonctions de manipulation de chaînes.
Analyse des données

Type : CREATION_INTERNE


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é !
1LIBNAME mycas cas;
2 
3DATA 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;
12RUN;
13 
14PROC PRINT DATA=mycas.chaine_basique;
15 title 'Résultats de l''indexation basique';
16RUN;
17 
18PROC CASUTIL incaslib='mycas' outcaslib='mycas';
19 dropcas casdata='chaine_basique' quiet;
20QUIT;
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é !
1LIBNAME mycas cas;
2 
3DATA 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;
12RUN;
13 
14PROC PRINT DATA=mycas.chaine_multioctet;
15 title 'Résultats de l''indexation multi-octets';
16RUN;
17 
18PROC CASUTIL incaslib='mycas' outcaslib='mycas';
19 dropcas casdata='chaine_multioctet' quiet;
20QUIT;
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é !
1LIBNAME mycas cas;
2 
3DATA 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.';
8 
9 pos_monde_varchar = index(phrase_varchar,'monde');
10 pos_monde_char = index(phrase_char,'monde');
11 
12 pos_non_trouve_varchar = index(phrase_varchar,'inexistant');
13 pos_non_trouve_char = index(phrase_char,'inexistant');
14 
15 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;
19RUN;
20 
21PROC PRINT DATA=mycas.chaine_avancee;
22 title 'Résultats de recherche avancée de sous-chaînes';
23RUN;
24 
25PROC CASUTIL incaslib='mycas' outcaslib='mycas';
26 dropcas casdata='chaine_avancee' quiet;
27QUIT;
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é !
1LIBNAME mycas cas;
2 
3DATA 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;
21RUN;
22 
23PROC PRINT DATA=mycas.chaine_substr_cas;
24 title 'Comparaison SUBSTR avec CHAR et VARCHAR en CAS';
25RUN;
26 
27PROC CASUTIL incaslib='mycas' outcaslib='mycas';
28 dropcas casdata='chaine_substr_cas' quiet;
29QUIT;
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.
Informations de Copyright : Copyright © SAS Institute Inc. All Rights Reserved.