Los ejemplos utilizan datos generados (datalines) o creaciones directas de tablas CAS a través de pasos DATA.
1 Bloque de código
DATA STEP Data
Explicación : Este ejemplo inicializa dos variables, una VARCHAR y una CHAR, con cadenas de caracteres de un solo byte. La función INDEX busca la posición del carácter 'c'. Como los caracteres son de un solo byte, las posiciones devueltas son idénticas (3), independientemente del tipo de variable, ilustrando el comportamiento estándar.
¡Copiado!
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 Bloque de código
DATA STEP Data
Explicación : Este ejemplo utiliza caracteres chinos multibyte. La variable VARCHAR(10) almacena '你好世界' como 4 caracteres. La búsqueda de '世' (el tercer carácter) devuelve 3 para VARCHAR. La variable CHAR(10) almacena la misma cadena, pero cada carácter ocupa 3 bytes. La búsqueda de '世' (el séptimo byte si se cuenta desde 1) devuelve 7 para CHAR, demostrando claramente la diferencia entre la semántica por carácter (VARCHAR) y por byte (CHAR).
¡Copiado!
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 Bloque de código
DATA STEP Data
Explicación : Este ejemplo profundiza en el uso de INDEX buscando una subcadena más larga ('monde') en variables CHAR y VARCHAR. Muestra que para caracteres de un solo byte, el comportamiento es el mismo. Además, ilustra qué sucede cuando la subcadena buscada no se encuentra (la función INDEX devuelve 0), un caso común en la manipulación de cadenas.
¡Copiado!
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 Bloque de código
DATA STEP Data
Explicación : Este ejemplo resalta la semántica de longitud utilizando la función SUBSTR en un entorno CAS, un elemento clave de Viya. Utiliza caracteres multibyte y muestra que SUBSTR en VARCHAR extrae caracteres según su posición lógica (por carácter), mientras que en CHAR, extrae bytes. Esto puede llevar a resultados inesperados si no se comprende la diferencia, especialmente si se intenta extraer partes de caracteres multibyte con una variable CHAR. También puede ser una fuente de error si la posición indicada está en medio de un carácter multibyte para una variable CHAR, o más allá del tamaño definido si no se considera la semántica.
¡Copiado!
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;
Este material se proporciona "tal cual" por We Are Cas. No hay garantías, expresas o implícitas, en cuanto a la comerciabilidad o idoneidad para un propósito particular con respecto a los materiales o el código contenidos en este documento. We Are Cas no es responsable de los errores en este material tal como existe ahora o existirá, ni We Are Cas proporciona soporte técnico para el mismo.
SAS y todos los demás nombres de productos o servicios de SAS Institute Inc. son marcas registradas o marcas comerciales de SAS Institute Inc. en los EE. UU. y otros países. ® indica registro en los EE. UU. WeAreCAS es un sitio comunitario independiente y no está afiliado a SAS Institute Inc.
Este sitio utiliza cookies técnicas y analíticas para mejorar su experiencia.
Saber más.