![]() |
AW: Im String Nach Wort suchen und nebenstehendes auslesen
Danke Klaus
genau das habe ich gesucht/versucht :-D |
AW: Im String Nach Wort suchen und nebenstehendes auslesen
Aber
Delphi-Quellcode:
Showmessage(GetValue('Name1= "Meier" Name2= "Schmidt" Strasse= "Hauptstrasse 22" Vorname= "Bernd"', 'Vorname'));
Liefert : Zitat:
|
AW: Im String Nach Wort suchen und nebenstehendes auslesen
Zitat:
Delphi-Quellcode:
;)
// Wenn es mal seltsame Ergebnisse gibt,
// dann muss ich wohl doch mit einem Parser ran |
AW: Im String Nach Wort suchen und nebenstehendes auslesen
Zitat:
|
AW: Im String Nach Wort suchen und nebenstehendes auslesen
Zitat:
|
AW: Im String Nach Wort suchen und nebenstehendes auslesen
Zitat:
Ich bin da auch nicht ganz sicher, was die optimale Variante ist, um das zu berichtigen, vielleicht:
Delphi-Quellcode:
Für alle weiteren Probleme die mit der Struktur noch auftreten könnten ist dieser Schnellschuss aber dann auch wirklich am Ende und es hilft nur noch ein Parser.
if meinString[Length(meinString)]='"' then
meinString=Copy(meinString,1,Length(meinString)-1); |
AW: Im String Nach Wort suchen und nebenstehendes auslesen
Mal eben schnell hingetippt.
Die Idee dahinter: Mit einer StringList kann man auch Wertepaare "verwalten". Da der String ja immer gleich aufgebaut sein soll, werden erstmal überflüssige Leerzeichen rausgeschmissen. Die Paare sind durch ein "=" verbunden. Ich meine, dass dann kein Leerzeichen dazwischen sein darf. Die Anführungszeichen mit folgendem Leerzeichen trennt ein Wertepaar vom nächsten. Der Sonderfall des letzten Wertepaares muss natürlich berücksichtigt werden.
Delphi-Quellcode:
Dann kann man einfach über:
var
SL : TStringList; Teil, Mein : String; begin SL := TStringList.Create; SL.NameValueSeparator := '='; Mein := StringReplace('Name1= "Meier" Name2= "Schmidt" Strasse= "Hauptstrasse 22" Vorname= "Bernd"', '= "', '="', [rfReplaceAll]); if length(Mein) > 0 then begin Repeat Teil := copy(Mein, 1, Pos('" ', Mein)); if Teil = '' then begin Teil := Mein; end; SL.Add(Teil); Delete(Mein, 1, Pos('" ', Mein) + 1); until Pos('" ', Mein) = 0; end; ShowMessage(SL.Values['Strasse']); end;
Delphi-Quellcode:
zum Beispiel an den Straßennamen kommen.
StringList.Values['Strasse']
Oder denke ich jetzt zu einfach? |
AW: Im String Nach Wort suchen und nebenstehendes auslesen
Nicht sehr elegant, und nur oberflächlich geprüft:
Delphi-Quellcode:
FUNCTION GetValue(const Text,Id:String):String;
var I,J,K,Len:Integer; begin Result:=''; if (Text='') or (Id='') then Exit; Len:=Length(ID); J:=0; repeat K:=PosEx('"',Text,J+1); // erstes '"' J:=PosEx('"',Text,K+1); // zweites '"' if J=0 then Exit; I:=J; while (I>0) and (Text[I]<>'=') do Dec(I); Dec(I); while (I>0) and (Text[I]=' ') do Dec(I); Dec(I,Len); if I>=0 then if SameText(Copy(Text,I+1,Len),Id) then begin if I<>0 then begin while (I>1) and (Text[I]=' ') do Dec(I); if (I>1) and (Text[I]<>'"') then Exit; end; Result:=Copy(Text,K+1,J-K-1); Exit; end; until False; end; |
AW: Im String Nach Wort suchen und nebenstehendes auslesen
Das Grundproblem ist und bleibt, dass die einzelnen Zeichen in dem Daten-String eine unterschiedliche Bedeutung haben können abhängig von den Zeichen davor.
Darum kann man nicht anhand eines einzelnen Zeichens die Bedeutung erkennen. Darum muss man parsen um diese Bedeutung interpretieren zu können. Darum braucht man auch eine komplette Beschreibung des Datenformats. Darum braucht man auch komplexe Beispiele.
Code:
Darum braucht man auch Unit-Tests um diese komplexen Beispiele gegen die Implementierung zu testen.
Key=Name1
Value=Ein = "schöner" = Tag Name1= "Ein = ""schöner"" = Tag" |
AW: Im String Nach Wort suchen und nebenstehendes auslesen
Völlig richtig, aber das Beispiel ist schon sehr konstruiert.
Es muss klar definiert sein, was vom Fremdprogramm kommt. Ansonsten wird auch der beste Parser nicht alle Fälle abdecken können. Auch ein Parser kann nur nach definierten Regeln die Daten analysieren. Aber wie du schon weiter oben geschrieben hast, sollte besser ein Standard-Format verwendet werden, falls möglich. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 12:43 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