Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Wort aus String extrahieren (https://www.delphipraxis.net/185657-wort-aus-string-extrahieren.html)

Sweex 27. Jun 2015 13:34


Wort aus String extrahieren
 
Hallo liebe Community,

Ich möchte für mein Programm nun ein Wort aus einem String extrahieren. Die Lösungen von Tante Google brachten mich hier nicht weiter, da ich die Wörter nicht per
Nummerierung ansprechen möchte (weil ich ja nicht immer das z.b. dritte Wort extrahieren möchte. Ich lese also mit dem Programm Fehlermeldungen als einen String aus, nun möchte ich das auf den wesentlichen Teil beschneiden.
Wenn dort z.b. steht "Messfehler in Modul 2A. Überprüfen Sie ebenfalls die Verbindung zu XY" dann soll er mir da 2A rausschneiden und sonst nichts. Manchmal kommen halt auch andere Fehlermeldungen z.b. "Aktualisierung bei Modul 2Orange Fehlgeschlagen." Das heißt ich muss mich auf Punkt oder Leerzeichen als Worttrenner verlassen können.

Ich versuchte es so zu lösen, wobei Outbound der mit der Fehlermeldung gefüllte String ist.


Delphi-Quellcode:
Suchwort:='Modul ';
Position := Pos(Suchwort, Outbound);
if Position <> 0 then begin
delete(Outbound, 1, pos(suchwort, Outbound) + length(suchwort) - 1);
Outbound := copy(Outbound, 1, pos(' ', Outbound) - 1);

Sir Rufo 27. Jun 2015 13:38

AW: Wort aus String extrahieren
 
Ich gehe mal davon aus, dass du diese Strings/Nachrichten selber erzeugst.

Warum hälst du die Nachrichten dann nicht mundgerecht vor? Dann könntest du dir dieses ganze Suchen und friemeln einfach sparen.

idefix2 27. Jun 2015 13:49

AW: Wort aus String extrahieren
 
Erst einmal solltest du dir überlegen (oder wenn du dir das schon überlegt hast, uns verraten), nach welchen Regeln dein Programm die "wichtigen" Wörter erkennt.
Was ist denn das Problem bei deinem Lösungsversuch?

Generell würde ich für alle Aufgaben, die mit Stringerkennung zu tun haben, eine Unit für reguläre Ausdrücke verwenden. Nachdem du uns deine Delphi Version nicht verrätst, können wir nicht wissen, ob so etwas bei deinem Dephi schon dabei ist oder nicht. Wenn nicht (Delphi vor XE) , gibt es z.B. TRegExpr

Sweex 27. Jun 2015 14:11

AW: Wort aus String extrahieren
 
okay, Sorry, also ich benutze Delphi XE8 und ich erzeuge diese Strings nicht selbst, sondern die werden mir praktisch Vorgegeben. Ich fange nur bestimmte Fehlermeldungen ab, wie die Beispiele die ich schon gegeben habe und kann mich so an wenige Suchwörter klammern (Modul, usw ..diese gebe ich also Vor und das reicht mir) die ich per Pos ja schon richtig abfrage, nur ich habe keine Ahnung wie man das beschneiden des Strings lösen kann das ich tatsächlich dann nur mein Zielwort erhalte, was ja varrieren kann, ebenso wie der Satzbau. Ich kann mich also wirklich nur an die Suchwörter klammern. Ich erkenne das Problem nicht, er scheint mir immer den kompletten String rauszuhauen, anstatt es korrekt zu beschneiden. Ich dachte ich hätte an dieser Stelle einen Fehler gemacht. Allerdings ist das Problem dann mit dem Trenner, also Leerzeichen UND Punkt leider noch nicht gelöst :-(

Nochmal zur Veranschaulichung:
Eingangsstring -> gewollter Ausgangsstring
Messfehler im Modul 2A. -> 2A
Kontaktproblem bei Modul 5A führt zu Ausfall -> 5A

Ich hoffe ich konnte die Klarheiten beseitigen :-)

Popov 27. Jun 2015 14:15

AW: Wort aus String extrahieren
 
Das Ganze hängt davon ab was du suchst. Ein Vorschlag von mir:
Delphi-Quellcode:
var
  Outbound, Suchwort: string;
  Position, i: Integer;
begin
  Outbound := 'Messfehler in Modul 2A. Überprüfen Sie ebenfalls die Verbindung zu XY';
  Suchwort := 'Messfehler in Modul';
  Position := Pos(Suchwort, Outbound);
  if Position > 0 then
  begin
    Delete(Outbound, 1, Position + Length(Suchwort) - 1);
    Outbound := TrimLeft(Outbound);
    i := 1;
    while (Outbound[i] in ['0'..'9', 'A'..'Z', 'a'..'z']) and (i <= Length(Outbound)) do
      Inc(i);
    Outbound := Copy(Outbound, 1, i - 1);
  end;
  ShowMessage(Outbound);
end;
Ich gehe davon aus, dass du die Modulnummer suchst. Ich gehe auch davon aus, dass sich das Zeichen nach der Nummer unterscheiden kann, also Leerzeichen, Punkt, Stringende. Deshalb würde ich es so wie oben machen. Ansonsten ist den Code schon mal nicht falsch. Das ist Quatsch:
Delphi-Quellcode:
if Position <> 0 then
, da das ergebnis 0 oder größer sein kann, aber nicht kleiner Null. Ansonsten ok.

Perlsau 27. Jun 2015 14:15

AW: Wort aus String extrahieren
 
Nachdem du den String bis zum Beginn des Suchwortes gelöscht hast (delete), steht das Suchwort am Anfang des Strings. Danach kopiest du das Suchwort mit Copy(Outbound,1,Length(Suchwort)-1) in einen neuen bzw. den alten String.

Sweex 27. Jun 2015 14:18

AW: Wort aus String extrahieren
 
Ihr seid fantastisch, ich probiere das sofort aus :-)

BUG 27. Jun 2015 14:20

AW: Wort aus String extrahieren
 
Trotzdem, guck dir reguläre Ausdrücke an. Für diese Art von Anwendung sind die der erste und meistens der beste Ansatz.

Sweex 27. Jun 2015 14:42

AW: Wort aus String extrahieren
 
[dcc32 Fehler] Amp.pas(309): E2081 Anweisung für FOR-Schleifenvariablen 'i'
Delphi-Quellcode:
i:=1;
und hier
[dcc32 Warnung] Amp.pas(310): W1050 WideChar in Set-Ausdrücken auf ByteChar verkürzt. Ziehen Sie die Verwendung der Funktion 'CharInSet' aus der Unit 'SysUtils' in Betracht.
Delphi-Quellcode:
while (Outbound[i] in ['0'..'9', 'A'..'Z', 'a'..'z']) and (i <= Length(Outbound)) do
Oh, warum meckert er nun? Ja die Ausdrücke gucke ich mir an, versprochen.

Edit: Hab den Fehler, eine schleife vorher war nicht korrekt geschlossen :-)

Aviator 27. Jun 2015 15:59

AW: Wort aus String extrahieren
 
In einer For-Schleife, in der du "i" als Zählervariable benutzt, kannst du nicht einfach "i" wieder auf irgend einen Wert setzen. Dafür solltest du dann
Delphi-Quellcode:
repeat ... until
oder
Delphi-Quellcode:
while ... do
benutzen.
Zitat:

Zitat von Sweex (Beitrag 1306841)
[dcc32 Warnung] Amp.pas(310): W1050 WideChar in Set-Ausdrücken auf ByteChar verkürzt. Ziehen Sie die Verwendung der Funktion 'CharInSet' aus der Unit 'SysUtils' in Betracht.
Delphi-Quellcode:
while (Outbound[i] in ['0'..'9', 'A'..'Z', 'a'..'z']) and (i <= Length(Outbound)) do

Ab Delphi 2009 :?: sollte man die Funktion CharInSet() für solche Konstrukte verwenden. Deshalb auch die Warnung. Als Beispiel so:

Delphi-Quellcode:
if CharInSet(Outbound[i], ['0'..'9', 'A'..'Z', 'a'..'z']) then ...


Alle Zeitangaben in WEZ +1. Es ist jetzt 19:27 Uhr.
Seite 1 von 2  1 2      

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz