Sentencia SPLIT en ABAP explicada: Dividir strings por delimitador

Kategorie
ABAP-Statements
Veröffentlicht
Autor
Johannes

La sentencia SPLIT sirve para dividir una variable de tipo carácter (por ejemplo, un String o un campo de tipo C) mediante un delimitador (Delimiter) especificado en múltiples subcadenas (segmentos). El resultado de esta división puede escribirse en variables individuales o, lo que suele ser más práctico, en las filas de una tabla interna.

Sintaxis

SPLIT <fuente> AT <delimitador>
INTO { {<destino1> <destino2> ...} | {TABLE <tabla_destino>} }
[IN CHARACTER MODE | IN BYTE MODE].
  • SPLIT <fuente>: Especifica la variable de tipo carácter (o un literal) que se va a dividir.
  • AT <delimitador>: (Obligatorio) Especifica el carácter o cadena de caracteres (literal o variable) que sirve como delimitador. La fuente se divide en cada aparición de este delimitador.
  • INTO <destino1> <destino2> ...: Una forma de recibir los resultados. Los segmentos encontrados se escriben secuencialmente en las variables <destino1>, <destino2>, etc. Estas también deben ser de tipo carácter (normalmente STRING o C).
    • Comportamiento: Si se encuentran más segmentos que variables destino disponibles, el resto completo de la fuente (¡incluyendo los delimitadores restantes!) se escribe en la última variable destino especificada. Si se encuentran menos segmentos, las variables destino sobrantes se reinician a su valor inicial (CLEAR).
  • INTO TABLE <tabla_destino>: El método más flexible. Cada segmento encontrado se escribe como nueva fila en la tabla interna <tabla_destino>. La tabla debe tener un tipo de línea de carácter apropiado (ej. STANDARD TABLE OF string). Importante: ¡La tabla destino se vacía automáticamente (CLEAR) antes del SPLIT!
  • IN CHARACTER MODE: (Predeterminado para fuente/delimitador de tipo carácter) Procesa los datos carácter por carácter.
  • IN BYTE MODE: Procesa los datos byte por byte (necesario para tipo X, XSTRING).

Funcionamiento

  1. La <fuente> se recorre de izquierda a derecha buscando el <delimitador>.
  2. Las cadenas entre los delimitadores encontrados forman los segmentos resultado.
  3. Los delimitadores mismos se eliminan y no forman parte de los segmentos.
  4. Si los delimitadores aparecen consecutivamente o al principio/final de la fuente, se generan segmentos vacíos.
  5. Los segmentos se escriben en las variables destino o como filas en la tabla destino.

Campo del sistema sy-subrc

  • sy-subrc = 0: Se establece en la mayoría de los casos, incluso si el delimitador no se encontró (entonces toda la fuente queda en el primer destino) o si se generaron segmentos vacíos.
  • sy-subrc = 4: Puede ocurrir en casos raros, por ejemplo, si se usa INTO <destino1>, el delimitador no se encontró y la fuente es más larga de lo que <destino1> puede contener.
  • Recomendación: No confíe demasiado en sy-subrc. En su lugar, verifique directamente los resultados (ej. lines( tabla_destino ) o el contenido de las variables destino).

Ejemplos

1. Dividir string separado por comas en variables

DATA lv_csv TYPE string VALUE 'García,Pedro,Madrid'.
DATA: lv_apellido TYPE string,
lv_nombre TYPE string,
lv_ciudad TYPE string.
SPLIT lv_csv AT ',' INTO lv_apellido lv_nombre lv_ciudad.
WRITE: / 'Apellido:', lv_apellido, " -> García
/ 'Nombre :', lv_nombre, " -> Pedro
/ 'Ciudad :', lv_ciudad. " -> Madrid

2. Dividir una frase en palabras en una tabla

DATA lv_sentence TYPE string VALUE 'Un ejemplo con espacios'. " Múltiples espacios
DATA lt_words TYPE STANDARD TABLE OF string.
SPLIT lv_sentence AT space INTO TABLE lt_words. " space es constante para ' '
LOOP AT lt_words INTO DATA(lv_word).
WRITE / 'Segmento:', |'{ lv_word }'|. " ¡Note los segmentos vacíos!
ENDLOOP.

Salida:

Segmento: 'Un'
Segmento: ''
Segmento: ''
Segmento: 'ejemplo'
Segmento: ''
Segmento: 'con'
Segmento: ''
Segmento: 'espacios'

3. Manejo de más segmentos que variables destino

DATA lv_parts TYPE string VALUE 'Parte1-Parte2-Parte3-Parte4'.
DATA: lv_p1 TYPE string,
lv_p2 TYPE string. " Solo 2 variables destino
SPLIT lv_parts AT '-' INTO lv_p1 lv_p2.
WRITE: / 'P1:', lv_p1, " -> Parte1
/ 'P2:', lv_p2. " -> Parte2-Parte3-Parte4 (¡el resto queda aquí!)

4. Demostrar segmentos vacíos

DATA lv_data TYPE string VALUE '|ValorA||ValorC|'. " Valor B faltante, delimitador inicial/final
DATA lt_segments TYPE STANDARD TABLE OF string.
SPLIT lv_data AT '|' INTO TABLE lt_segments.
LOOP AT lt_segments INTO DATA(lv_segment).
WRITE / sy-tabix, '. Segmento:', |'{ lv_segment }'|.
ENDLOOP.

Salida:

1 . Segmento: ''
2 . Segmento: 'ValorA'
3 . Segmento: ''
4 . Segmento: 'ValorC'
5 . Segmento: ''

Notas importantes / Mejores prácticas

  • SPLIT no modifica la variable fuente original.
  • Los delimitadores se pierden durante la división.
  • Sea consciente de que pueden generarse segmentos vacíos.
  • El uso de INTO TABLE es generalmente más flexible y robusto, ya que no necesita preocuparse por el número exacto de segmentos. La tabla siempre se inicializa (vacía) automáticamente antes de usarse.
  • SPLIT es muy útil para parsear datos estructurados simples como líneas CSV o rutas de archivos.