Delphi-PRAXiS
Seite 2 von 3     12 3      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Im String Nach Wort suchen und nebenstehendes auslesen (https://www.delphipraxis.net/187545-im-string-nach-wort-suchen-und-nebenstehendes-auslesen.html)

CVi 8. Dez 2015 08:55

AW: Im String Nach Wort suchen und nebenstehendes auslesen
 
Danke Klaus

genau das habe ich gesucht/versucht :-D

baumina 8. Dez 2015 09:10

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:

Bernd"

Sir Rufo 8. Dez 2015 09:12

AW: Im String Nach Wort suchen und nebenstehendes auslesen
 
Zitat:

Zitat von CVi (Beitrag 1323721)
Danke Klaus

genau das habe ich gesucht/versucht :-D

Schreib dir wenigstens in den Quellcode hinein:
Delphi-Quellcode:
// Wenn es mal seltsame Ergebnisse gibt,
// dann muss ich wohl doch mit einem Parser ran
;)

Sir Rufo 8. Dez 2015 09:14

AW: Im String Nach Wort suchen und nebenstehendes auslesen
 
Zitat:

Zitat von baumina (Beitrag 1323722)
Aber

Delphi-Quellcode:
Showmessage(GetValue('Name1= "Meier" Name2= "Schmidt" Strasse= "Hauptstrasse 22" Vorname= "Bernd"', 'Vorname'));

Liefert :
Zitat:

Bernd"

Darum sind Unit-Tests auch zwingend notwendig.

vagtler 8. Dez 2015 09:29

AW: Im String Nach Wort suchen und nebenstehendes auslesen
 
Zitat:

Zitat von Sir Rufo (Beitrag 1323724)
[...] Darum sind Unit-Tests auch zwingend notwendig.

Ach, komm, (Unit-)Testing wird überbewertet. Reicht doch, wenn es kompiliert... :mrgreen:

Jumpy 8. Dez 2015 09:31

AW: Im String Nach Wort suchen und nebenstehendes auslesen
 
Zitat:

Zitat von Sir Rufo (Beitrag 1323724)
Zitat:

Zitat von baumina (Beitrag 1323722)
Aber

Delphi-Quellcode:
Showmessage(GetValue('Name1= "Meier" Name2= "Schmidt" Strasse= "Hauptstrasse 22" Vorname= "Bernd"', 'Vorname'));

Liefert :
Zitat:

Bernd"

Darum sind Unit-Tests auch zwingend notwendig.

Leider hab ich es noch nicht geschafft DUnit im Browser einzubinden und für die fehlerfreie Einbindung im Kopf fehlte noch der Kaffee. :-D
Ich bin da auch nicht ganz sicher, was die optimale Variante ist, um das zu berichtigen, vielleicht:
Delphi-Quellcode:
  if meinString[Length(meinString)]='"' then
    meinString=Copy(meinString,1,Length(meinString)-1);
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.

Jasocul 8. Dez 2015 12:06

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:
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;
Dann kann man einfach über:
Delphi-Quellcode:
StringList.Values['Strasse']
zum Beispiel an den Straßennamen kommen.

Oder denke ich jetzt zu einfach?

Amateurprofi 8. Dez 2015 12:29

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;

Sir Rufo 8. Dez 2015 13:05

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:
Key=Name1
Value=Ein = "schöner" = Tag

Name1= "Ein = ""schöner"" = Tag"
Darum braucht man auch Unit-Tests um diese komplexen Beispiele gegen die Implementierung zu testen.

Jasocul 8. Dez 2015 13:20

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.
Seite 2 von 3     12 3      

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