Publicado el :
Manipulación de datos CREATION_INTERNE

Función INDEX con cadenas CHAR y VARCHAR

Este código también está disponible en: Deutsch English Français
En espera de validación
El análisis funcional detalla cómo la función INDEX se comporta de manera diferente según el tipo de variable (CHAR o VARCHAR), especialmente en presencia de caracteres multibyte. Las variables VARCHAR usan una semántica de longitud por caracteres, donde la posición se calcula en unidades de caracteres, mientras que las variables CHAR usan una semántica de longitud por bytes, donde la posición se calcula en bytes. Esto es crucial para el procesamiento de datos en entornos SAS© Viya y CAS, donde la distinción puede afectar los resultados de las funciones de manipulación de cadenas.
Análisis de datos

Type : CREATION_INTERNE


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!
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 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!
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 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!
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 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!
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;
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.
Información de copyright : Copyright © SAS Institute Inc. All Rights Reserved.