Veröffentlicht am :
Datenmanipulation CREATION_INTERNE

INDEX-Funktion mit CHAR- und VARCHAR-Strings

Dieser Code ist auch verfügbar auf: English Español Français
Wartet auf Validierung
Die Funktionsanalyse beschreibt detailliert, wie sich die INDEX-Funktion je nach Variablentyp (CHAR oder VARCHAR) unterschiedlich verhält, insbesondere bei Multi-Byte-Zeichen. VARCHAR-Variablen verwenden eine zeichenbasierte Längensemantik, bei der die Position in Zeicheneinheiten berechnet wird, während CHAR-Variablen eine bytebasierte Längensemantik verwenden, bei der die Position in Bytes berechnet wird. Dies ist entscheidend für die Datenverarbeitung in SAS© Viya- und CAS-Umgebungen, wo der Unterschied die Ergebnisse von String-Manipulationsfunktionen beeinflussen kann.
Datenanalyse

Type : CREATION_INTERNE


Die Beispiele verwenden generierte Daten (Datalines) oder direkte Erstellungen von CAS-Tabellen über DATA-Schritte.

1 Codeblock
DATA STEP Data
Erklärung :
Dieses Beispiel initialisiert zwei Variablen, eine VARCHAR und eine CHAR, mit Einzelbyte-Zeichenketten. Die INDEX-Funktion sucht die Position des Zeichens 'c'. Da es sich um Einzelbyte-Zeichen handelt, sind die zurückgegebenen Positionen (3) unabhängig vom Variablentyp identisch, was das Standardverhalten veranschaulicht.
Kopiert!
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 Codeblock
DATA STEP Data
Erklärung :
Dieses Beispiel verwendet chinesische Multi-Byte-Zeichen. Die VARCHAR(10)-Variable speichert '你好世界' als 4 Zeichen. Die Suche nach '世' (dem dritten Zeichen) ergibt 3 für VARCHAR. Die CHAR(10)-Variable speichert dieselbe Zeichenkette, aber jedes Zeichen belegt 3 Bytes. Die Suche nach '世' (dem 7. Byte, wenn man ab 1 zählt) ergibt 7 für CHAR und demonstriert deutlich den Unterschied zwischen zeichenbasierter Semantik (VARCHAR) und bytebasierter Semantik (CHAR).
Kopiert!
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 Codeblock
DATA STEP Data
Erklärung :
Dieses Beispiel vertieft die Verwendung von INDEX, indem es eine längere Unterzeichenfolge ('monde') in CHAR- und VARCHAR-Variablen sucht. Es zeigt, dass bei Einzelbyte-Zeichen das Verhalten dasselbe ist. Darüber hinaus veranschaulicht es, was passiert, wenn die gesuchte Unterzeichenfolge nicht gefunden wird (die INDEX-Funktion gibt 0 zurück), ein häufiger Fall bei der String-Manipulation.
Kopiert!
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 Codeblock
DATA STEP Data
Erklärung :
Dieses Beispiel verdeutlicht die Längensemantik unter Verwendung der SUBSTR-Funktion in der CAS-Umgebung, einem Schlüsselelement von Viya. Es verwendet Multi-Byte-Zeichen und zeigt, dass SUBSTR bei VARCHAR Zeichen basierend auf ihrer logischen Position (nach Zeichen) extrahiert, während es bei CHAR Bytes extrahiert. Dies kann zu unerwarteten Ergebnissen führen, wenn der Unterschied nicht verstanden wird, insbesondere wenn versucht wird, Teile von Multi-Byte-Zeichen mit einer CHAR-Variable zu extrahieren. Dies kann auch eine Fehlerquelle sein, wenn die angegebene Position mitten in einem Multi-Byte-Zeichen für eine CHAR-Variable liegt oder die definierte Größe überschreitet, wenn die Semantik nicht berücksichtigt wird.
Kopiert!
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;
Dieses Material wird von We Are Cas "wie besehen" zur Verfügung gestellt. Es gibt keine ausdrücklichen oder stillschweigenden Garantien hinsichtlich der Marktgängigkeit oder Eignung für einen bestimmten Zweck in Bezug auf die hierin enthaltenen Materialien oder Codes. We Are Cas ist nicht verantwortlich für Fehler in diesem Material, wie es jetzt existiert oder existieren wird, noch bietet We Are Cas technischen Support dafür an.
Urheberrechtsinformationen : Copyright © SAS Institute Inc. All Rights Reserved.