Delphi-PRAXiS
Seite 1 von 3  1 23      

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 07:29

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 !!!

baumina 8. Dez 2015 07:47

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.

CVi 8. Dez 2015 08:00

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.

Sir Rufo 8. Dez 2015 08:07

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:

Gollum 8. Dez 2015 08:20

AW: Im String Nach Wort suchen und nebenstehendes auslesen
 
Hallo,

mal auf die Schnelle, mit Pos und PosEx:

Delphi-Quellcode:
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
Nun kannst Du den entsprechenden Wert folgendermaßen erhalten:
Delphi-Quellcode:
...
const
  teststring='Name1= "Meier" Name2= "Schmidt" Strasse= "Hauptstrasse 22" Vorname= "Bernd" usw....';
...
...
ShowMessage(FindeWert(teststtring, 'Strasse='));

baumina 8. Dez 2015 08:27

AW: Im String Nach Wort suchen und nebenstehendes auslesen
 
Und wenn der Name2 "Strassemann" lautet hast ein Problem.

Sir Rufo 8. Dez 2015 08:29

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.

Klaus01 8. Dez 2015 08:39

AW: Im String Nach Wort suchen und nebenstehendes auslesen
 
.. noch ein Ansatz:

Delphi-Quellcode:
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;
Grüße
Klaus

Sir Rufo 8. Dez 2015 08:45

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:
Name1= "Meier" Whatever= "Strasse= ""Nö""" Vorname= "Bernd" Strasse= "Hauptstrasse 22"
Zudem sollte man immer berücksichtigen, dass es durchaus üblich ist den Whitespace zu ignorieren. Dadurch ist dann
Code:
Vorname= "Bernd" Strasse= "Hauptstrasse 22"
gleich
Code:
Vorname="Bernd" Strasse="Hauptstrasse 22"
gleich
Code:
Vorname=     "Bernd" Strasse=     "Hauptstrasse 22"
gleich
Code:
Vorname = "Bernd" Strasse = "Hauptstrasse 22"
gleich
Code:
Vorname= "Bernd"
Strasse= "Hauptstrasse 22"
usw. usw.

Nur deswegen ist es z.B. bei JSON möglich, den JSON-String auch formatiert auszugeben.

Jumpy 8. Dez 2015 08:53

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.
Seite 1 von 3  1 23      

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