Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   bestimmtes Wort aus einem String auslesen (https://www.delphipraxis.net/207159-bestimmtes-wort-aus-einem-string-auslesen.html)

ashkan19 1. Mär 2021 08:30

bestimmtes Wort aus einem String auslesen
 
hallo allerseits,

Ich hab hier ein kniffliges aber einfaches Problem. Ich habe die folgende Zeile in einem Tstringlist gespeichert:

#EXTINF:-1 tvg-id="" tvg-name="" tvg-language="Hindi" tvg-logo="http://mhdtvworld.com/wp-content/uploads/2018/12/PUNJAB5AAB.jpg" tvg-country="IN" tvg-url="" group-title="",5aab TV


nun möchte ich das Wort nach tvg-language zwischen die zwei "" nämlich "Hindi" ganz einfach auslesen.

gibt es eine bestimmte Vorgehensweise dafür?

Klaus01 1. Mär 2021 08:59

AW: bestimmtes Wort aus einem String auslesen
 
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var
  sl: TStringList;
begin
  sl := TStringList.Create;
  try
    sl.DelimitedText := '#EXTINF:-1 tvg-id="" tvg-name="" tvg-language="Hindi" tvg-logo="http://mhdtvworld.com/wp-content/uploads/2018/12/PUNJAB5AAB.jpg" tvg-country="IN" tvg-url="" group-title="",5aab TV';
    sl.Delimiter := ' ';
    edit1.Text := sl.Values['tvg-language'];
  finally
    sl.Free;
  end;
end;
.. dann nur noch die Hochkommatas entfernen.

Grüße
Klaus

ashkan19 1. Mär 2021 09:10

AW: bestimmtes Wort aus einem String auslesen
 
Genial, danke dir Klaus

himitsu 1. Mär 2021 12:35

AW: bestimmtes Wort aus einem String auslesen
 
SL.StrictDelimiter unbedingt auch auf True setzen, sonst wird eventuell nicht so getrennt, wie gedacht.

Der schöne Günther 1. Mär 2021 14:41

AW: bestimmtes Wort aus einem String auslesen
 
Wenn dir allerdings niemand schwört dass diese
Delphi-Quellcode:
name="wert"
-Paare in genau dieser Reihenfolge bei dir eintreffen solltest du besser mit regulären Ausdrücken arbeiten.

himitsu 1. Mär 2021 17:14

AW: bestimmtes Wort aus einem String auslesen
 
Die Reihenfolge ist ja egal, da auf de Namen gegangen wird.

Zitat:

Delphi-Quellcode:
sl.Values['tvg-language']


Mavarik 2. Mär 2021 09:19

AW: bestimmtes Wort aus einem String auslesen
 
Nicht's gegen die Idee von Klaus01 - darauf währe ich jetzt nicht gekommen, sehr schön einfach.

Allerdings würde ich auch nicht einen String in eine Stringliste Umformen um einen Teilstring zu ermitteln.
Das sieht mir nach einem Teil einer Webseite aus. Ich möchte diese Umformung sicherlich nicht für jede Zeile machen oder für die ganze Seite.

Ich suche mit Pos nach dem Token. Mit PosEx nach dem 1. " mit PosEx nach dem 2." und kopiere dann den Text da raus.

Und wenn es richtig schnell gehen soll suche ich mit einem PChar durch den String!

Mavarik

himitsu 2. Mär 2021 09:24

AW: bestimmtes Wort aus einem String auslesen
 
OK, mit Pos suchen und nochmal Delphi-Referenz durchsuchenPoSex für's Ende,
oder eben RegEx.

Aber nein, das mit der StringListe ist nicht wirklich falsch,
denn per se ist das nunmal eine leerzeichen-getrennte Liste, welche von den Anderen bestimmt auch so ähnlich behandelt wird, also in eine Liste der Werte zerlegt.
(sowas machen wir z.B. auch täglich mit den Params zu unseren Programmen, wenn wir sie auslesen)

KodeZwerg 2. Mär 2021 09:50

AW: bestimmtes Wort aus einem String auslesen
 
Zitat:

Zitat von himitsu (Beitrag 1484237)

Du weißt schon was da steht? :stupid:

Man könnte auch bei Pos() per Offset ans Ziel kommen.

himitsu 2. Mär 2021 10:01

AW: bestimmtes Wort aus einem String auslesen
 
Ohhh, seit wann hat denn das normale Pos ein optionales Offset? (klar, das wäre schon immer die schönste/eionfachste Lösung gewesen)

und Ja. ( tse tse tse ... siehst du immer überall nur die perversen Dinge? )

Mavarik 2. Mär 2021 10:01

AW: bestimmtes Wort aus einem String auslesen
 
Zitat:

Zitat von KodeZwerg (Beitrag 1484243)
Zitat:

Zitat von himitsu (Beitrag 1484237)

Du weißt schon was da steht? :stupid:

Man könnte auch bei Pos() per Offset ans Ziel kommen.

Hast Du etwas gegen... Nein das führt hier in die falsche Richtung...

@himitsu

Klar, aber performant ist das mit der Stringliste nicht.

KodeZwerg 2. Mär 2021 10:51

AW: bestimmtes Wort aus einem String auslesen
 
Zitat:

Zitat von himitsu (Beitrag 1484245)
Ohhh, seit wann hat denn das normale Pos ein optionales Offset?

Das ist eine Super Frage im allgemeinen.
Bei Pos() kenne ich es seit Ewigkeiten, aber wie findet man so etwas ganz genau raus wann welche funktion/methode eingeführt bzw um Parameter X erweitert wurde. Bei solchen Fragen stehe ich immer aufm Schlauch.

Sorry wegen der anderen Anspielung, ich fands lustig in dem Moment.

himitsu 2. Mär 2021 12:53

AW: bestimmtes Wort aus einem String auslesen
 
Ja, du kannst halt entweder die Hilfen durchblättern (viele Versionen seit 2006 sind online),
oder man könnte den Quellcode der Installation vergleichen. (vielleicht hast'e ein Backupprogramm, was dir ein Diff bietet)

Ich hatte mal angefangen die Delphi-Installationen in ein lokales Git-Repo zu schieben, damit man sowas vergleichen/suchen kann, weil ich mich auch öfters mal sowas frage,
aber effektiv hab ich erst die TurboPascal bis Delphi 1 fertig .... und veröffentlichen kann ich das ab Delphi auch nicht.
Vielleicht könnte mal via GetIt, an die "bestätigten" Besitzer der jeweiligen Delphi-Editionen inkl. Vorgänger. (selbst prüfen wer es hat, will ich nicht)

Für eine vollständige Historie fehlt mir aber noch bissl was.
BLS Pascal (PolyPascal ist da, aber der Vorgänger nicht), Delphi EEP (kenn niemanden, der es hatte), Delphi 5 und Delphi 6.

Ist aber nur ein Hobbyrojektchen, was so seit 'nem Jahr läuft und wo ich selten was dran mach. :oops:



Bei den StringHelprn hatte ich paar mal geguckt,
aber hier nie ... es gab ja PosEx.


Zitat:

performant
Och, alles "hochoptimieren" tu ich nicht mehr.
Wenn es geht, dann mach ich lieber "einfach". (auch wenn es 'ne nanosekunde langsamer sein mag)

Und ja, per se nehme ich auch lieber Lösungen, welche ohne Extra-Speicheroperationen auskommen, also direkt suchen, anstatt umformatieren und dann ... aber machmal ist "einfach" eben einfacher.

Mavarik 2. Mär 2021 13:06

AW: bestimmtes Wort aus einem String auslesen
 
OT:

Zitat:

Zitat von himitsu (Beitrag 1484260)
Och, alles "hochoptimieren" tu ich nicht mehr.
Wenn es geht, dann mach ich lieber "einfach". (auch wenn es 'ne nanosekunde langsamer sein mag)

Oh, Ich mache es genau umgekehrt. Bei jeder Lösung überlege ich erst, wie geht es am schnellsten und wenn das mit wenig Aufwand zu implementieren ist, mache ich es so...
Besondern, wenn ich erst eine Klasse erzeugen muss, mache ich es am liebsten anders.

Ich hatte ja mal vor Jahren geschrieben, wenn jeder Entwickler mal überlegen würde, wie es schneller geht, müssten wir heute nicht 10 cores on 5GHz nehmen und das gleiche zu erreichen,
wie vor zig Jahren mit Windows 3.11 und einem 486er...

Aber EGAL!

himitsu 2. Mär 2021 14:06

AW: bestimmtes Wort aus einem String auslesen
 
Man muß es immer bissl abwägen.

Ist das jetzt kein Code, der Milliardenfach ausgeführt wird, dann ist es womöglich nicht schlimm, wenn er 'ne Millisekunde länger braucht.

Seit FastMM standardmäßig im Delphi ist,
dann kann man meißtens Glück haben und er hat noch genügend freie Flecken, wo alle Strings rein passen, womit nicht "wirklich" Speicher reserviert/freigegeben werden muß (in Windows)
Der Speicherverbrauch ist hier auch nur kurz bissl höher. (der String ist nicht lang und somit fällt es auch nicht wirklich auf zwischen all den Gigabyte)

Somit kann man sehr oft nach dem Motto "keep it simple" arbeiten.

Und optimieren kann man später immernoch.


OK, direkt extrem unperformanten Code zu verwenden, das versuche ich zu vermeiden, aber zwanghaft IMMER muß nicht sein.



Für eine Behandlung einer INI innerhalb der datenbank, hatte ich mir mal das Read/Write/Delete je als 1-Zeiler aus RegEx gebaut.
Anfangs war es so schön "einfach" und kurz ... OK, nach paar "Sonderfällen" ist der RegEx inzwischen ... naja ... mit einer Schleife in einer StoredProc ist es bestimmt übersichtlicher.

KodeZwerg 2. Mär 2021 14:30

AW: bestimmtes Wort aus einem String auslesen
 
Da stimme ich zu.
Erstmal nach dem 'keep it simple stupid' Prinzip und später im Refactoring kann man immer noch abwägen ob hier oder da eine Optimierung angebracht sein sollte.

Okay, auf eindeutige Schwächen geh ich schon direkt ein.

Ausnahme bei mir ist wenn ich pur nativ programmiere (nonVcl), da ist mein verlangen zur bestmöglichen Performance von vornherein sehr hoch.

hhcm 2. Mär 2021 14:40

AW: bestimmtes Wort aus einem String auslesen
 
Ich finde es ist nicht immer nötig alles mit Klassen zu machen oder es auf die letzte ms auszureizen.
Natürlich kommt es immer stark auf den Anwendungszweck an.
High-End ERP System, dann lieber OOP. Quick 'n Dirty Tool um was zu testen, da darf es schonmal nen 2-3 Zeiler direkt im OnClick eines Buttons sein.

Im Falle dieses Threads hätte ich mir die Stringliste auch gespart.

Delphi-Quellcode:
Result := TRegEx.Match(InputString, 'tvg-language=\"(.*?)\"').Groups[1].Value;

himitsu 2. Mär 2021 14:53

AW: bestimmtes Wort aus einem String auslesen
 
Problem, wenn der Wert nicht in der Liste ist, dann raucht dein Code ab.
Die dagegen StringList gibt bei Nichtexistenz wortlos einen Leerstring raus.

Es gibt RegEx-Implementationen die ählich reagieren, aber standardmäßig ist hier dieses [1] ein potentielles risiko. (wenn man es nicht abfängt/prüft)

Mavarik 2. Mär 2021 15:37

AW: bestimmtes Wort aus einem String auslesen
 
Zitat:

Zitat von KodeZwerg (Beitrag 1484276)
Erstmal nach dem 'keep it simple stupid' Prinzip und später im Refactoring kann man immer noch abwägen ob hier oder da eine Optimierung angebracht sein sollte.

Ja das wird immer so gesagt, aber sind wir doch mal ehrlich... Wenn Du Routine läuft, packt die keiner mehr an...

Wenn es bei einer großen Datei dann zu lange dauert, kommt eher ein "Bitte Warten" Fenster drum rum anstatt, vor schon mal die Routine 10x schneller zu machen.

Aber wir schweifen ab...

Mavarik

hhcm 2. Mär 2021 16:25

AW: bestimmtes Wort aus einem String auslesen
 
Zitat:

Zitat von himitsu (Beitrag 1484279)
Problem, wenn der Wert nicht in der Liste ist, dann raucht dein Code ab.
Die dagegen StringList gibt bei Nichtexistenz wortlos einen Leerstring raus.

Ich wollte damit nicht den Einzeiler schmackhaft machen.
Da gehört z.B noch TRegEx.IsMatch vor.

TStringList als "PHP Explode" oder Parser zu nutzen ist jedenfalls (Achtung, freie Meinungsäußerung) ein no-go.

Lange rede etc. "Bestimmstes Wort auslesen" = Regex.


Alle Zeitangaben in WEZ +1. Es ist jetzt 18:12 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