Na, das Stichwort hast Du doch schon genannt: "Split". 😁 Es existiert ein gleichnamiger Befehl, und der ist hier genau die richtige Wahl.
Code: Alles auswählen.
types: BEGIN OF t_ergebnis,
line type string,
END OF t_ergebnis.
DATA: lt_ergebnis type TABLE OF t_ergebnis,
ls_ergebnis LIKE LINE OF lt_ergebnis.
types: BEGIN OF t_split,
customer(10) TYPE c,
material(10) TYPE c,
purchaseorder(10) type c,
wunschlieferdatum(10) type c,
menge(5) type c,
werk(5) type c,
END OF t_split.
DATA: lt_split type TABLE OF t_split,
ls_split LIKE LINE OF lt_split.
* Hier Deine Tabelle lt_ergebnis befüllen und dann:
LOOP AT lt_ergebnis ASSIGNING FIELD-SYMBOL(<ergebniszeile>).
APPEND INITIAL LINE TO lt_split ASSIGNING FIELD-SYMBOL(<neue_zeile>).
SPLIT <ergebniszeile> AT ';' INTO TABLE DATA(lt_hilfstabelle_spalten).
LOOP AT lt_hilfstabelle_spalten ASSIGNING FIELD-SYMBOL(<spaltenwert>).
ASSIGN COMPONENT sy-tabix OF STRUCTURE <neue_zeile> to FIELD-SYMBOL(<spalte_der_zieltabelle>).
<spalte_der_zieltabelle> = <spaltenwert>.
ENDLOOP.
ENDLOOP.
Ich hoffe, Du hast keine Angst vor Feldsymbolen, denn das ist moderne und performante Programmierung. 😊 Wenn doch, würde ich Dir raten, daran zu arbeiten. Wenn man sich daran gewöhnt hat, programmiert es sich damit viel flüssiger, und Felder wie Dein ls_ergebnis brauchst Du dann nicht mehr
(hast also weniger Ballast im DATA-Block). Ein wenig schneller (performanter) ist es obendrein.
Kurz zur Erklärung, was in obenstehendem Codeblock passiert: Für jede Zeile in lt_ergebnis willst Du eine Zeile in t_split haben. Also LOOPe ich durch lt_ergebnis und lege zunächst eine leere Zeile in t_split an, für die ich mir aber gleich ein Feldsymbol geben lasse, so dass ich sie im Anschluss befüllen kann.
(Damit spare ich mir ein Workarea-Feld (Stichwort Ballast), da ich die Zielzeile gewissermaßen selbst als Workarea verwende oder, genauer gesagt, die Werte direkt dorthin (in die Zieltabelle lt_split) verfrachte, anstatt mit ihnen erst eine Workarea-Struktur aufzubauen, die ich anschließend der Tabelle hinzufüge.)
Dann teile ich die gelesene Zeile von lt_ergebnis an den Semikola in eine Hilftabelle lt_hilfstabelle_spalten auf, so dass jede Zeile von lt_hilfstabelle_spalten einen Spaltenwert enthält. Dann LOOPe ich über diese Hilfstabelle. Zu jeder Zeile beschaffe ich mir ein Feldsymbol auf die entsprechende Spalte der angelegten Leerzeile und fülle den Wert rein.
Im Prinzip kann man sagen, dass der SPLIT-Befehl die Spalte transponiert, wie man das von Excel oder anderen Tabellenkalkulationen kennt, also aus den Spalten Zeilen macht. In meinem inneren LOOP transponiere ich sie dann wieder zurück, mache also aus den Zeilen der Hilfstabelle wieder Spalten von lt_split.
Das setzt natürlich voraus, dass die Spalten in lt_ergebnis in genau der Reihenfolge stehen wie in lt_split. In Deinem Beispiel habe ich das unterstellt.
Gerade kürzlich habe ich eine Variante programmiert, bei der das nicht (notwendigerweise) so ist, sondern bei der meine csv-Datei eine Überschriftenzeile enthält. Die werte ich aus und suche mir dazu die passende Spalte in meiner Zieltabelle. Das kriegt man auch mit dem ASSIGN COMPONENT-Befehl hin, dann freilich nicht wie in obigen Codeschnipsel mit Komponentennummer, sondern mit Komponentenwert
(der Befehl kann beides, siehe seine Online-Hilfe).