L’instruction SPLIT sert à diviser une variable de type caractère (par exemple une chaîne ou un champ de type C) en fonction
d’un caractère de séparation (délimiteur) défini en plusieurs sous-chaînes (segments). Le résultat
de cette division peut être écrit soit dans des variables individuelles, soit - ce qui est souvent plus pratique - dans les lignes d’une table
interne.
Syntaxe
SPLIT <source> AT <separateur> INTO { {<cible1> <cible2> ...} | {TABLE <table_cible>} } [IN CHARACTER MODE | IN BYTE MODE].SPLIT <source>: Indique la variable de type caractère (ou un littéral) à diviser.AT <separateur>: (Obligatoire) Indique le caractère ou la chaîne de caractères (littéral ou variable) servant de séparateur. À chaque occurrence de ce séparateur, la source est divisée.INTO <cible1> <cible2> ...: Une façon de recevoir les résultats. Les segments trouvés sont écrits successivement dans les variables<cible1>,<cible2>, etc. Celles-ci doivent également être de type caractère (souventSTRINGouC).- Comportement : Si plus de segments sont trouvés que de variables cibles disponibles, le reste entier de
la source (y compris les séparateurs restants !) est écrit dans la dernière variable cible indiquée. Si moins
de segments sont trouvés, les variables cibles excédentaires sont réinitialisées à leur valeur initiale (
CLEAR).
- Comportement : Si plus de segments sont trouvés que de variables cibles disponibles, le reste entier de
la source (y compris les séparateurs restants !) est écrit dans la dernière variable cible indiquée. Si moins
de segments sont trouvés, les variables cibles excédentaires sont réinitialisées à leur valeur initiale (
INTO TABLE <table_cible>: La méthode plus flexible. Chaque segment trouvé est écrit comme nouvelle ligne dans la table interne<table_cible>. La table doit avoir un type de ligne caractère approprié (par ex.STANDARD TABLE OF string). Important : La table cible est automatiquement vidée (CLEAR) avant leSPLIT!IN CHARACTER MODE: (Par défaut pour source/séparateur de type caractère) Traite les données caractère par caractère.IN BYTE MODE: Traite les données octet par octet (nécessaire pour le typeX,XSTRING).
Fonctionnement
- La
<source>est recherchée de gauche à droite pour le<separateur>. - Les chaînes de caractères entre les séparateurs trouvés forment les segments résultants.
- Les séparateurs eux-mêmes sont supprimés et ne font pas partie des segments.
- Si les séparateurs se suivent directement ou se trouvent au début/fin de la source, des segments vides sont créés.
- Les segments sont écrits soit dans les variables cibles, soit comme lignes dans la table cible.
Champ système sy-subrc
sy-subrc = 0: Est défini dans la plupart des cas, même si le séparateur n’a pas été trouvé (alors toute la source atterrit dans la première cible) ou si des segments vides ont été créés.sy-subrc = 4: Peut se produire dans de rares cas, par ex. siINTO <cible1>est utilisé, le séparateur n’a pas été trouvé et la source est plus longue que<cible1>ne peut contenir.- Recommandation : Ne vous fiez pas trop à
sy-subrc. Vérifiez plutôt directement les résultats (par ex.lines( table_cible )ou le contenu des variables cibles).
Exemples
1. Décomposer une chaîne séparée par des virgules en variables
DATA lv_csv TYPE string VALUE 'Müller,Petra,Hambourg'.DATA: lv_name TYPE string, lv_prenom TYPE string, lv_ville TYPE string.
SPLIT lv_csv AT ',' INTO lv_name lv_prenom lv_ville.
WRITE: / 'Nom :', lv_name, " -> Müller / 'Prénom:', lv_prenom, " -> Petra / 'Ville :', lv_ville. " -> Hambourg2. Décomposer une phrase en mots dans une table
DATA lv_sentence TYPE string VALUE 'Un exemple avec des espaces'. " Espaces multiplesDATA lt_words TYPE STANDARD TABLE OF string.
SPLIT lv_sentence AT space INTO TABLE lt_words. " space est constante pour ' "
LOOP AT lt_words INTO DATA(lv_word). WRITE / 'Segment:', |'{ lv_word }'|. " Notez les segments vides !ENDLOOP.Sortie :
Segment: 'Un"Segment: '"Segment: '"Segment: 'exemple"Segment: '"Segment: 'avec"Segment: '"Segment: 'des espaces"3. Gestion de plus de segments que de variables cibles
DATA lv_parts TYPE string VALUE 'Partie1-Partie2-Partie3-Partie4'.DATA: lv_p1 TYPE string, lv_p2 TYPE string. " Seulement 2 variables cibles
SPLIT lv_parts AT '-' INTO lv_p1 lv_p2.
WRITE: / 'P1:', lv_p1, " -> Partie1 / 'P2:', lv_p2. " -> Partie2-Partie3-Partie4 (le reste atterrit ici !)4. Démonstration de segments vides
DATA lv_data TYPE string VALUE '|ValeurA||ValeurC|'. " Valeur B manquante, séparateur début/finDATA 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, '. Segment:', |'{ lv_segment }'|.ENDLOOP.Sortie :
1 . Segment: '" 2 . Segment: 'ValeurA" 3 . Segment: '" 4 . Segment: 'ValeurC" 5 . Segment: '"Remarques importantes / Bonnes pratiques
SPLITne modifie pas la variable source originale.- Les séparateurs sont perdus lors de la division.
- Soyez conscient que des segments vides peuvent se créer.
- L’utilisation de
INTO TABLEest généralement plus flexible et robuste, car vous n’avez pas à vous soucier du nombre exact de segments. La table est toujours automatiquement initialisée (vidée) avant utilisation. SPLITest très utile pour analyser des données structurées simples comme des lignes CSV ou des chemins.