AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Programmieren allgemein Im String Nach Wort suchen und nebenstehendes auslesen
Thema durchsuchen
Ansicht
Themen-Optionen

Im String Nach Wort suchen und nebenstehendes auslesen

Ein Thema von CVi · begonnen am 8. Dez 2015 · letzter Beitrag vom 8. Dez 2015
Antwort Antwort
Seite 1 von 3  1 23      
CVi

Registriert seit: 21. Nov 2010
15 Beiträge
 
#1

Im String Nach Wort suchen und nebenstehendes auslesen

  Alt 8. Dez 2015, 07:29
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 !!!
  Mit Zitat antworten Zitat
Benutzerbild von baumina
baumina

Registriert seit: 5. Mai 2008
Ort: Oberschwaben
1.275 Beiträge
 
Delphi 11 Alexandria
 
#2

AW: Im String Nach Wort suchen und nebenstehendes auslesen

  Alt 8. Dez 2015, 07:47
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.
Hinter dir gehts abwärts und vor dir steil bergauf ! (Wolfgang Ambros)
  Mit Zitat antworten Zitat
CVi

Registriert seit: 21. Nov 2010
15 Beiträge
 
#3

AW: Im String Nach Wort suchen und nebenstehendes auslesen

  Alt 8. Dez 2015, 08:00
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.
  Mit Zitat antworten Zitat
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#4

AW: Im String Nach Wort suchen und nebenstehendes auslesen

  Alt 8. Dez 2015, 08:07
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)
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)
  Mit Zitat antworten Zitat
Benutzerbild von Gollum
Gollum

Registriert seit: 14. Jan 2003
Ort: Boxberg
456 Beiträge
 
Delphi 10.1 Berlin Professional
 
#5

AW: Im String Nach Wort suchen und nebenstehendes auslesen

  Alt 8. Dez 2015, 08:20
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='));

Geändert von Gollum ( 8. Dez 2015 um 08:32 Uhr) Grund: Danke an baumina für den Hinweis
  Mit Zitat antworten Zitat
Benutzerbild von baumina
baumina

Registriert seit: 5. Mai 2008
Ort: Oberschwaben
1.275 Beiträge
 
Delphi 11 Alexandria
 
#6

AW: Im String Nach Wort suchen und nebenstehendes auslesen

  Alt 8. Dez 2015, 08:27
Und wenn der Name2 "Strassemann" lautet hast ein Problem.
Hinter dir gehts abwärts und vor dir steil bergauf ! (Wolfgang Ambros)
  Mit Zitat antworten Zitat
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#7

AW: Im String Nach Wort suchen und nebenstehendes auslesen

  Alt 8. Dez 2015, 08:29
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.
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)

Geändert von Sir Rufo ( 8. Dez 2015 um 08:39 Uhr)
  Mit Zitat antworten Zitat
Klaus01

Registriert seit: 30. Nov 2005
Ort: München
5.755 Beiträge
 
Delphi 10.4 Sydney
 
#8

AW: Im String Nach Wort suchen und nebenstehendes auslesen

  Alt 8. Dez 2015, 08:39
.. 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
Klaus
  Mit Zitat antworten Zitat
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#9

AW: Im String Nach Wort suchen und nebenstehendes auslesen

  Alt 8. Dez 2015, 08:45
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.
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)

Geändert von Sir Rufo ( 8. Dez 2015 um 08:50 Uhr)
  Mit Zitat antworten Zitat
Jumpy

Registriert seit: 9. Dez 2010
Ort: Mönchengladbach
1.733 Beiträge
 
Delphi 6 Enterprise
 
#10

AW: Im String Nach Wort suchen und nebenstehendes auslesen

  Alt 8. Dez 2015, 08:53
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;
Ralph

Geändert von Jumpy ( 8. Dez 2015 um 09:07 Uhr) Grund: Vertippert
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 3  1 23      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 14:10 Uhr.
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