![]() |
Im String Nach Wort suchen und nebenstehendes auslesen
im string nach wort suchen und nebenstehende (in hoch Komma) werte auslesen?
meinstring := 'Name1= "Meier" Vorname= "Bernd" Strasse= "Hauptstrasse 22" usw....' die Reihenfolge des strings kann variieren oder auch andere Daten hinzukommen. also zb. meinstring := 'Name1= "Meier" Name2= "Schmidt" Strasse= "Hauptstrasse 22" Vorname= "Bernd" usw....' nun möchte ich, egal wie der string aufgebaut ist in dem meinstring zb. nach Strasse suchen und er soll mir Hauptstrasse 22 ausgeben. mit functionen wie getstring und pos/posex komme ich da irgendwie nicht weiter. entweder denke ich zu kompliziert oder es ist wirklich nicht so einfach :? HILFE !!! |
AW: Im String Nach Wort suchen und nebenstehendes auslesen
Hast du den String selbst so aufgebaut, oder ist der zwingend so vorgegeben? Wenn Du ihn selbst so aufgebaut hast, dann mach das besser über eine Liste. Ist der String so vorgegeben, müsstest du das mit pos schon hinbekommen, zeig mal deinen Code dazu.
|
AW: Im String Nach Wort suchen und nebenstehendes auslesen
Der ist leider zwingend so vorgegeben. (wird von einem fremdprogramm empfangen).
einen wirklich post-baren code habe ich im Moment nicht da ich nur am rumprobieren bin und ständig wieder auf anfang stehe :( mein Problem bei pos oder ähnlichem ist, das die werte in den hoch kommas bei jedem datensatz unterschiedlich lang sind und ich so den einstiegs bzw. austiegspunkt nicht ermitteln kann. |
AW: Im String Nach Wort suchen und nebenstehendes auslesen
Um die Werte aus dem Daten-String zuverlässig herauslesen und schreiben zu können muss man den Daten-String parsen.
Beim Parsen wird dann auch die Struktur auf Gültigkeit untersucht. Dieser Parser übersetzt dann den Daten-String in eine Struktur (hier eine Key-Value-Liste) mit der man dann im Programm weiter arbeiten kann. Praktischerweise baut man sich auch noch einen Writer, der diese Struktur dann wieder in so einen Daten-String schreiben kann. Mit dem Daten-String selber sollte man nie arbeiten (es sei denn, man steht auf Schmerzen) :mrgreen: |
AW: Im String Nach Wort suchen und nebenstehendes auslesen
Hallo,
mal auf die Schnelle, mit Pos und PosEx:
Delphi-Quellcode:
Nun kannst Du den entsprechenden Wert folgendermaßen erhalten:
function FindeWert(const aText, aSuche:String):String;
var x1, x2:Integer; begin Result:=''; x1:=Pos(aSuche, aText); // Ist Suchtext überhaupt vorhanden? if (x1>0) then begin x1:=PosEx('"', aText, x1+Length(aSuche)); // 1. Anführungszeichen suchen if (x1>0) then // gefunden? begin x2:=PosEx('"', aText, x1+1); // 2. Anführungszeichen suchen if (x2>0) then // gefunden? Result:=Copy(aText, x1+1, x2-x1-1) // Ergebnis zusammenbasteln end; end; end; // FindeWert
Delphi-Quellcode:
...
const teststring='Name1= "Meier" Name2= "Schmidt" Strasse= "Hauptstrasse 22" Vorname= "Bernd" usw....'; ... ... ShowMessage(FindeWert(teststtring, 'Strasse=')); |
AW: Im String Nach Wort suchen und nebenstehendes auslesen
Und wenn der Name2 "Strassemann" lautet hast ein Problem.
|
AW: Im String Nach Wort suchen und nebenstehendes auslesen
Dieser Ansatz hilft nur dann weiter, wenn man ausschliessen kann, dass so ein Keyword niemals in den Daten enthalten ist.
Genau das wird man aber nicht können ;) Es führt kein Weg am Parsen vorbei, denn man muss die Struktur analysieren um Beschreibung und Daten zu erkennen. UPDATE Aus diesem Grund ist man auch gut beraten, wenn man sich zum Datenaustausch auf ein Standard-Format (JSON, XML, YAML, ...) einigt, denn dort ist die Wahrscheinlichkeit sehr hoch eine fertige Bibliothek nutzen zu können. |
AW: Im String Nach Wort suchen und nebenstehendes auslesen
.. noch ein Ansatz:
Delphi-Quellcode:
Grüße
procedure TForm1.Button1Click(Sender: TObject);
var meinstring: String; RegEx: TPerlRegEx; begin meinString := 'Name1= "Meier" Vorname= "Bernd" Strasse= "Hauptstrasse 22"'; RegEx := TPerlRegEx.Create; try RegEx.RegEx := 'Strasse= "(.+)"'; RegEx.Subject := meinString; if RegEx.Match then showMessage(RegEx.MatchedText+' '+RegEx.Groups[1]) else showMessage('nothing found') finally RegEx.free; end; end; Klaus |
AW: Im String Nach Wort suchen und nebenstehendes auslesen
Such mal im Netz, warum man eine HTML/XML Datei nicht mit RegEx untersuchen soll.
Aus dem gleichen Grund sollte man auch hier darauf verzichten. Und hier das Beispiel, wo du mit deinem Ansatz auf die Nase fällst:
Code:
Zudem sollte man immer berücksichtigen, dass es durchaus üblich ist den Whitespace zu ignorieren. Dadurch ist dann
Name1= "Meier" Whatever= "Strasse= ""Nö""" Vorname= "Bernd" Strasse= "Hauptstrasse 22"
Code:
gleich
Vorname= "Bernd" Strasse= "Hauptstrasse 22"
Code:
gleich
Vorname="Bernd" Strasse="Hauptstrasse 22"
Code:
gleich
Vorname= "Bernd" Strasse= "Hauptstrasse 22"
Code:
gleich
Vorname = "Bernd" Strasse = "Hauptstrasse 22"
Code:
usw. usw.
Vorname= "Bernd"
Strasse= "Hauptstrasse 22" Nur deswegen ist es z.B. bei JSON möglich, den JSON-String auch formatiert auszugeben. |
AW: Im String Nach Wort suchen und nebenstehendes auslesen
Ein anderer Schnellschuss-Versuch, wobei ein Parser sicher die bessere Lösung ist, aber die Fragestellung des TE weist darauf hin, dass das noch zu schwierig sein könnte. Das Folgende funktioniert aber nur, wenn die Struktur des Strings immer genauso ist, wie in den Beispielen. Eine Prüfung dessen, wie mit einem Parser hat man nicht:
Delphi-Quellcode:
function GetValue(InputString, ValueName:String):String;
var s:TStringlist; meinString:String; begin s:TStringlist.create; meinString := InputString; //Bereinigen: meinString := StringReplace(meinString,'= "','=',[rfReplaceAll]); meinString := StringReplace(meinString,'="','=',[rfReplaceAll]); meinString := StringReplace(meinString,'" ',',',[rfReplaceAll]); s.DelimitedText:=meinString; Result:=s.Values[ValueName]; s.free; end; |
Alle Zeitangaben in WEZ +1. Es ist jetzt 02:41 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz