%SPLIT (Dividir serie en subseries)
%SPLIT(string {: separators { : *ALLSEP {: *NATURAL | *STDCHARSIZE}}})
%SPLIT divide una serie en una matriz de subseries. Devuelve una matriz temporal de las subseries.
- SORTA
- %ELEM
- %LOOKUP
- %SUBARR
El primer operando es la serie que se va a dividir. Puede ser alfanumérico, gráfico o UCS-2.
- Si no se especifica, o si se especifica *BLANK o *BLANKS , %SPLIT se divide en espacios en blanco.
- Si se especifica y no *BLANK o *BLANKS:
- Si no tiene el mismo tipo o CCSID que el primer operando, se convierte al tipo y CCSID del primer operando.
- Si la longitud del segundo operando es mayor que 1, cualquiera de los caracteres del segundo operando indica el final de cada subserie. Por ejemplo,
%SPLIT('abc.def-ghi' : '.-')tiene dos caracteres separadores,'.'y'-', por lo que devuelve una matriz con tres elementos:('abc','def','ghi').
El tercer operando puede ser *ALLSEP, lo que indica que se considera que cada separador separa dos subseries. Cuando no se especifica *ALLSEP , los separadores que siguen a otros separadores, separadores iniciales y separadores finales se ignoran.
- Especifique *NATURAL para indicar que %SPLIT opera en modalidad CHARCOUNT NATURAL . El número de bytes en cada carácter se tiene en cuenta al localizar los separadores. Por ejemplo, si el parámetro
stringes una serie UTF-8 con el valor '1á2ç3', y el parámetroseparatorses una serie UTF-8 con el valor 'á' solo 'á' se considera que es un separador. Las series de resultados son '1' y '2ç3'. - Especifique *STDCHARSIZE para indicar que %SPLIT opera en modalidad CHARCOUNT STDCHARSIZE . En el ejemplo anterior, con la modalidad CHARCOUNT STDCHARSIZE , cada byte de
separatorse considera un carácter separador. Los caracteres "á" y "ç" son caracteres de 2 bytes,x'C3A1'yx'C3A7'. Los primeros bytes de "á" y "ç" son iguales,x'C3', por lo que el primer byte de "ç" se considera un separador. Los elementos de resultado de %SPLIT no son todos válidos, ya que algunos caracteres UTF-8 se han dividido incorrectamente.
Cómo %SPLIT maneja los separadores
En la tabla siguiente, se presupone que el separador es '.'.
| Tipo de separador | Serie que se va a dividir | Sin *ALLSEP | Con *ALLSEP |
|---|---|---|---|
| Un separador inicial | '.abc' |
Una matriz con un elemento: ('abc') |
Una matriz con dos elementos: ('','abc') |
| Un separador adicional | 'abc..def' |
Una matriz con dos elementos: ('abc','def') |
Una matriz con tres elementos: ('abc','','def') |
| Un separador de cola | 'def.' |
Una matriz con un elemento: ('def') |
Una matriz con dos elementos: ('def','') |
| Varios separadores adicionales | '..abc..def..' |
Una matriz con dos elementos: ('abc','def') |
Una matriz con siete elementos: ('','','abc','','def','','') |
Si la longitud del operando separadores es cero, el resultado es un único elemento con el valor del operando de serie. Por ejemplo, si sep tiene una longitud de cero, %SPLIT('a.b.c' : sep) devuelve una matriz con un elemento: ('a.b.c').
Si la serie tiene una longitud de cero, %SPLIT devuelve cero elementos.
- Si no se especifica *ALLSEP , %SPLIT devuelve cero elementos.
- Si se especifica *ALLSEP , %SPLIT devuelve
N + 1series vacías, dondeNes la longitud de la serie.
ejemplos de %SPLIT
- En el ejemplo siguiente, %SPLIT sólo tiene un parámetro, por lo que la serie se divide en blancos.
DCL-S array VARCHAR(10) DIM(10); array = %SPLIT('Monday Tuesday Wednesday'); // array(1) = "Monday" // array(2) = "Tuesday" // array(3) = "Wednesday" - En el ejemplo siguiente, %SPLIT tiene dos parámetros. El segundo parámetro tiene dos caracteres, punto (.) y blanco. La serie se divide cuando se encuentra cualquiera de los caracteres del segundo parámetro.
DCL-S array VARCHAR(10) DIM(10); array = %SPLIT('Today is Monday. Tomorrow is Tuesday.' : '. '); // array(1) = "Today" // array(2) = "is" // array(3) = "Monday" // array(4) = "Tomorrow" // array(5) = "is" // array(6) = "Tuesday" - En el ejemplo siguiente, la operación FOR-EACH se utiliza para procesar las matrices temporales devueltas por %SPLIT.
- La serie se divide primero en frases, dividiéndose en los caracteres utilizados para finalizar una frase.
- A continuación, la serie se divide en frases, dividiéndose en comas, dos puntos y punto y coma.
- A continuación, cada frase se divide en palabras, dividiéndose en espacios en blanco.
DCL-S sentence VARCHAR(10000); DCL-S phrase VARCHAR(10000); DCL-S word VARCHAR(10000); DCL-S string VARCHAR(10000); FOR-EACH sentence in %SPLIT(string : '.!?'); // 1 ... FOR-EACH phrase in %SPLIT(sentence : ',;:'); // 2 ... FOR-EACH word in %SPLIT(phrase); // 3 ... ENDFOR; ENDFOR; ENDFOR; - En el ejemplo siguiente, el programador RPG no desea que %SPLITignore los separadores adicionales.
- La serie normalmente contiene tres nombres, separados por comas:
'Mary,Jane,Smith'. - Si no hay un segundo nombre, hay dos comas juntas:
'Mary,,Smith'.
Para asegurarse de que todas las comas actúan como separadores, se especifica *ALLSEP .
DCL-S string VARCHAR(100); DCL-S names VARCHAR(100) DIM(3); string = 'Mary,Jane,Smith'; names = %SPLIT (string : ',' : *ALLSEP); // names = Mary | Jane | Smith string = 'Mary,,Smith'; names = %SPLIT (string : ',' : *ALLSEP); // names = Mary | | Smith - La serie normalmente contiene tres nombres, separados por comas: