%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.

%SPLIT se puede utilizar en sentencias de cálculo siempre que se pueda utilizar una matriz excepto:
  • SORTA
  • %ELEM
  • %LOOKUP
  • %SUBARR

El primer operando es la serie que se va a dividir. Puede ser alfanumérico, gráfico o UCS-2.

El segundo operando es la lista de caracteres que indican el final de cada subserie. Es opcional a menos que se especifique *ALLSEP como tercer parámetro.
  • 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.

El parámetro final puede ser *NATURAL o *STDCHARSIZE para alterar temporalmente la modalidad CHARCOUNT actual para la sentencia. Si se especifica este parámetro, debe ser el último parámetro.
  • 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 string es una serie UTF-8 con el valor '1á2ç3', y el parámetro separators es 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 separator se considera un carácter separador. Los caracteres "á" y "ç" son caracteres de 2 bytes, x'C3A1' y x'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.
Consulte Proceso de datos de serie por el tamaño natural de cada carácter y Tipo de datos de carácter.
Nota: %SPLIT también puede operar en modalidad CHARCOUNT NATURAL debido a la directiva de compilador /CHARCOUNT o a la palabra clave de control CHARCOUNT .

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 todos los caracteres de la serie son uno de los caracteres separadores:
  • Si no se especifica *ALLSEP , %SPLIT devuelve cero elementos.
  • Si se especifica *ALLSEP , %SPLIT devuelve N + 1 series vacías, donde N es 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.
    1. La serie se divide primero en frases, dividiéndose en los caracteres utilizados para finalizar una frase.
    2. A continuación, la serie se divide en frases, dividiéndose en comas, dos puntos y punto y coma.
    3. 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