Page 1 of 1

String zerlegen und in interne Tabelle packen

PostPosted: Fri Dec 06, 2002 12:38 pm
by Jolin2218
Hallo,

ich bin's mal wieder mit einem für Euch wahrscheinlich trivialen Problem. Ich habe einen String, dessen Länge ich nicht kenne (aber zur Laufzeit ermitteln kann, vermutlich durch STRLEN). Nun muß der String aber in jeweils 132-Zeichen-Blöcke zerlegt werden und in eine interne Tabelle gepackt werden (also eine Tabellenzeile ist genauso ein 132-Zeichen-Block) Wie würdet Ihr das machen?
Vorab Danke.

Gruß,
Jens

PostPosted: Fri Dec 06, 2002 3:37 pm
by Willy1492
Wenn die itab Zeilen des Typs C hat und wenn die Länge 132 gleich definierte Länge der itab-Zeile ist:
Code: [Select all] [Expand/Collapse] [Download] (Untitled.txt)
  1. DATA: str_len TYPE I, wa_len TYPE I, offset TYPE I.
  2. DESCRIBE FIELD ... LENGTH wa_len. " bestimmt hast Du ein passendes Feld.
  3.  
  4. DESCRIBE FIELD str ... LENGTH str_len. " oder str_len = strlen( str ).
  5. * je nach Typ bzw. welche Info Du brauchst.
  6.  
  7. CLEAR itab[]. " Falls nicht sicher ist, daß die itab leer ist
  8.   APPEND str+offset TO itab.
  9.   ADD wa_len TO offset.
  10.   IF offset GE str_len.
  11.     EXIT.
  12.   ENDIF.
  13.  
GeSHi ©


Falls die itab auch länger sein kann als die 132 Zeicheen, die Du anhängen willst, brauchst Du wieder eine Variable für die Länge und muß noch mitrechnen, damit Du nicht mit offset+len über das Ende von str hinaus zugreifen willst, sonst kommt es zum Laufzeitfehler.[/code]

PostPosted: Fri Dec 06, 2002 4:07 pm
by Jolin2218
Respekt! Die Lösung ist klasse. Einfach und schnell! Danke.

Hab noch einen Bug gefunden

PostPosted: Fri Dec 06, 2002 4:44 pm
by Willy1492
Ich bin mir fast sicher, daß wenn str vom Typ STRING ist und ausnahmsweise auch mal leer sein kann (strlen also 0 ist), die Anweisung
Code: [Select all] [Expand/Collapse] [Download] (Untitled.txt)
  1.   APPEND str+offset TO itab.
GeSHi ©

zu einem Dump führt, auch wenn offset 0 ist.

PostPosted: Mon Dec 09, 2002 4:30 pm
by Jolin2218
Hi Frank,

nochmals danke. Ich hatte mir eine wesentlich umständlichere Lösung ausgedacht, insofern bin ich mit der Lösung von Dir sehr zufrieden und hab mein Coding weggeschmissen :D

Gruß,
Jens