Textmuster im String finden und herausziehen

Alles rund um die Sprache ABAP®: Funktionsbausteine, Listen, ALV
20 Beiträge • Seite 1 von 2 (current) Nächste
20 Beiträge Seite 1 von 2 (current) Nächste

Textmuster im String finden und herausziehen

Beitrag von chfreise (ForumUser / 51 / 0 / 0 ) »
Hallo zusammen,

aus einem Textstring muss ich eine Nummer finden. Ausschlaggebend dafür ist, dass vorher z.b. "Kunde" bzw. "AUFTRAG" steht. Anschließend soll die folgende 10stellige Nummer selektiert werden.

Bitte helft mir auf die Sprünge. Die Befehle FIND, SPLIT sagen mir schon etwas, aber irgendwie stehe ich auf dem Schlauch.

Danke und Gruß
CHF

gesponsert
Stellenangebote auf ABAPforum.com schalten
kostenfrei für Ausbildungsberufe und Werksstudenten


Beitrag von Steff (Site Admin / 386 / 0 / 1 ) »
Hallo,

es gibt z.b. Befehle wie CP (Contains Pattern) oder CO ' 1234567890' (zum Pruefen ob ich Nummern vorliegen habe), etc.
Koenntest Du bitte etwas mehr Infos zur Verfuegung stellen, wofuer das ganz gut sein soll, d.h. um was fuer einen Textstring handelt es sich? Gibt es Trennzeichen oder nicht?
Es hoert sich irgendwie nach el. Kontoauszug und Auswertung nach Verwendungszweck an. Stimmt das?
Vielleicht kannst Du ja einen Beispieltextstring hier posten? Dann kann man sicherlich besser helfen.

Gruss,
Steff

Beitrag von chfreise (ForumUser / 51 / 0 / 0 ) »
Hallo Steff,

zuerst einmal danke für Deine Antwort.

Es wird der Fuba READ TEXT genutzt. Anschließend soll in der Rückgabetabelle nach dem Wort (Suchkriterium) "Auftrag:" bzw "AUFTRAG:" gesucht werden, weil angrenzend zu diesem Wort die entsprechende Nummer (hier die Auftragsnummer) steht.

Als Beispiel vielleicht folgendes:
Textzeile aus der Tabelle LINES "es wurde folgender Auftrag:1234567890 erstellt"
Ich kann nicht nach ":" suchen, da der Doppelpunkt auch so im Text vorkommen kann. Mein Suchkriterium "AUFTRAG:" bzw "Auftrag:" ist in diesem Fall aber eindeutig.

Ich hoffe Du kannst mir so weiterhelfen.

Danke und Gruß
CHF

Beitrag von Haubi (Expert / 625 / 20 / 30 ) »
Tach.

Wie wär's folgendermassen:

Code: Alles auswählen.

FIND SUBSTRING 'Auftrag:' IN l_str
  IGNORING CASE
  MATCH OFFSET l_off
  MATCH LENGTH l_len.
In l_off hast Du dann den Offset im String, in l_len die Länge des gefundenen Strings. Über sy-subrc erfährst Du, ob der String überhaupt gefunden wurde.

Gruß,
Haubi
Das ABAP Kochbuch ab sofort bei Amazon...

I'd rather write code that writes code than write code...

Beitrag von Haubi (Expert / 625 / 20 / 30 ) »
Einen hab ich noch:

Code: Alles auswählen.

DATA
  : l_str TYPE string
  , lt_result TYPE match_result_tab
  , ls_result TYPE match_result
  .
  l_str = 'Dies ist Auftrag: 4711 und hier kommt Blödsinn'.

  FIND REGEX 'Auftrag: ([0-9]+) '
    IN l_str
    IGNORING CASE
    RESULTS lt_result.
In lt_result hast Du dann den Match auf den Gesamtstring. Dazu gibt's den Submatch, der direkt auf die Auftragsnummer zeigt, inklusive der Länge der Auftragsnummer. (Schau Dir das dann am besten mal im Debugger an, is schlecht zu erklären...)

Gruß,
Haubi
Das ABAP Kochbuch ab sofort bei Amazon...

I'd rather write code that writes code than write code...

Beitrag von chfreise (ForumUser / 51 / 0 / 0 ) »
Hallo Haubi,

besten Dank - Dein "Einen hab ich noch" hilft mir sehr gut. Jetzt kann ich auch anhand der Position und Längenangabe aus dem Submatch direkt die Nummer herausziehen. Die brauche ich ja für die weitere Verarbeitung.

ich danke und vollende nun das "Werk" :-)
Schönen Tag noch

Gruß
CHF

Beitrag von Steff (Site Admin / 386 / 0 / 1 ) »
Einen hab ich auch noch ;-) :-)
Zwar nicht perfektioniert, aber denke es reicht um eine weitere Loesung mit CP aufzuzeigen.
Ausserdem muss bedacht werden, dass u.U. die Strings nicht immer wie erwartet kommen (mit Doppelpunkt oder ohne, Gross-/Kleinschreibung, etc. etc.)
Diese Variante erlaubt alle Nummern zu extrahieren (geht dabei natuerlich von gewissen Annahmen aus).

Code: Alles auswählen.

data: teststring type string.
data: pos type i,
      clen type i,
      t_auftrno type standard table of string with header line.


teststring = 'blabla: gugug:AuftraG: 9384781390: und noch ein Auftrag: 09382783728'.


translate teststring to Upper Case.
condense teststring no-gaps.




while teststring cp '*AUFTRAG:*'.
 clen = strlen( teststring ).
 if clen ne sy-fdpos.
     pos = sy-fdpos + 8.
     t_auftrno = teststring+pos(10).
     append t_auftrno.
     pos = pos + 10.
     teststring = teststring+pos.
 endif.
endwhile.
Gruss,
Steff

Beitrag von Haubi (Expert / 625 / 20 / 30 ) »
Hi Steff.

Lass uns doch mal philosophieren... ;-)
  • Das Problem der Groß-/Kleinschreibung berücksichtigen beide Varianten
  • Wenn ich meine Variante um ein "ALL OCCURENCES" erweitere findet man damit auch alle Vorkommen
  • Deine Variante geht davon aus, dass die Auftragsnummer immer 10-stellig ist
  • Das Problem des u.U. fehlenden Doppelpunkts kann ich in der RegEx relativ einfach berücksichtigen
Von daher komme ich auf folgende etwas verbesserte Version:

Code: Alles auswählen.

DATA
  : l_str     TYPE string
  , lt_result TYPE match_result_tab
  , ls_result TYPE match_result
  , ls_subres TYPE submatch_result
  .
l_str = 'Dies ist Auftrag: 4711 und hier kommt Blödsinn und noch ein Auftrag 8012132654216578454 und wieder Blödsinn:1elf!1'.

FIND ALL OCCURRENCES OF REGEX 'Auftrag(:*) ([0-9]+) '
  IN l_str
  IGNORING CASE
  RESULTS lt_result.

WRITE: / l_str.
SKIP.
LOOP AT lt_result INTO ls_result.
  WRITE: / ls_result-offset, ls_result-length.
  LOOP AT ls_result-submatches INTO ls_subres.
    WRITE: /7 ls_subres-offset, ls_subres-length.
    IF sy-tabix = 2.
      WRITE: l_str+ls_subres-offset(ls_subres-length).
    ENDIF.
  ENDLOOP.
ENDLOOP.
Ich habe pro Match zwei Submatches, daher kann ich im inneren LOOP immer davon ausgehen, das der zweite Submatch meine Auftragsnummer ist, die auch in voller Länge abgegriffen wird.

Jetzt besser? :wink:

Gruß,
Haubi
Das ABAP Kochbuch ab sofort bei Amazon...

I'd rather write code that writes code than write code...

Beitrag von Steff (Site Admin / 386 / 0 / 1 ) »
Hi Haubi,

absolut ... tehehe :-). Deine Variante ist unbestritten klasse! :-)
Hab lediglich noch die Variante mit CP dargelegen wollen und damit etwas rumgespielt. Im Endeffekt ist aber die von Dir dargelegte Methode mit regex klar die flexiblere und effektivere.

Viele Gruesse,
Steff

Beitrag von Bitfummler (Specialist / 111 / 4 / 3 ) »
..
Zuletzt geändert von Bitfummler am 10.11.2008 14:58, insgesamt 1-mal geändert.

Beitrag von Bitfummler (Specialist / 111 / 4 / 3 ) »
vergiss es. ich glaube, ich hatte mich da grad verlesen..

Beitrag von edwin (Specialist / 306 / 12 / 68 ) »
Hi,
ich hätte da einen Vorschlag:

Code: Alles auswählen.

FIND ALL OCCURRENCES OF REGEX '\bAuftrag([:\s]+)([0-9]+)'
  IN l_str
  IGNORING CASE
  RESULTS lt_result.
damit wird auch:
"Auftrag:1234"
"Auftrag :1234"
"Auftrag : 1234"
aber nicht
"BlödsinnAuftrag: 1234"
gefunden

Gruss Edwin

Beitrag von chfreise (ForumUser / 51 / 0 / 0 ) »
Hallo zusammen,

erstmal eine großes Dankeschön für Eure Hilfe.
Nun habe ich aber ein neues Problem.
Es kann auch vorkommen, dass die Auftragsnummer zwischen Sternen vorkommt. Also *12345678980*
Der * hat aber eine andere Bedeutung und ich kann ja nicht direkt danach suchen.
Aber wie?

Bitte eine schnelle Lösung.

Danke und Gruß
CHF

Beitrag von Haubi (Expert / 625 / 20 / 30 ) »
...dann lautet die RegEx

Code: Alles auswählen.

'Auftrag(:*) \**([0-9]+)\** '
Dabei gehe ich davon aus, dass die Asterikse optional sind...

Gruß,
Haubi
Das ABAP Kochbuch ab sofort bei Amazon...

I'd rather write code that writes code than write code...

Beitrag von chfreise (ForumUser / 51 / 0 / 0 ) »
danke, aber was sind für Dich "die Asterikse" ?

Vergleichbare Themen

12
Antw.
4837
Views
CSV String
von Django90 » 02.10.2017 08:58 • Verfasst in ABAP® für Anfänger
5
Antw.
6892
Views
String nach Hex
von wummy » 26.02.2007 09:11 • Verfasst in ABAP® Core
13
Antw.
4603
Views
String merging
von naratcis » 08.05.2008 16:29 • Verfasst in ABAP® Core
8
Antw.
5634
Views
String splitten
von Marc K. » 23.08.2012 11:35 • Verfasst in ABAP® für Anfänger
10
Antw.
7735
Views
Convert String to PDF
von Johannes9090 » 13.10.2014 17:15 • Verfasst in ABAP® für Anfänger

Newsletter Anmeldung

Keine Beiträge verpassen! Wöchentlich versenden wir lesenwerte Beiträge aus unserer Community.
Die letzte Ausgabe findest du hier.
Details zum Versandverfahren und zu Ihren Widerrufsmöglichkeiten findest du in unserer Datenschutzerklärung.