AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Substrings Extract Delimited Values

Ein Thema von Sequitar · begonnen am 2. Nov 2023 · letzter Beitrag vom 6. Nov 2023
Antwort Antwort
Benutzerbild von Olli73
Olli73

Registriert seit: 25. Apr 2008
Ort: Neunkirchen
772 Beiträge
 
#1

AW: Substrings Extract Delimited Values

  Alt 3. Nov 2023, 08:54
Warum nicht einfach:
Delphi-Quellcode:
var
  SL: TStringList;
begin
  SL := TStringList.Create;
  SL.Delimiter := ADelimiter;
  SL.StrictDelimieter := True;
  SL.DelimitedText := AText;
  ...
Oder habe ich etwas falsch verstanden?
  Mit Zitat antworten Zitat
mytbo

Registriert seit: 8. Jan 2007
478 Beiträge
 
#2

AW: Substrings Extract Delimited Values

  Alt 3. Nov 2023, 14:12
Oder habe ich etwas falsch verstanden?
Grundsätzlich hast du nichts falsch verstanden. In der Anfrage ging es um Beschleunigung am Beispiel. Meine Lösung ist ca. 1/3 schneller als das TStrings Äquivalent. In der Praxis vermutlich irrelevant.

Bis bald...
Thomas
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.599 Beiträge
 
Delphi 12 Athens
 
#3

AW: Substrings Extract Delimited Values

  Alt 3. Nov 2023, 14:45
Das Anfügen an die TStringList benötigt aber ja auch seine Zeit.

Einen wohl auch akzeptabel schnellen Ansatz bietet das bordeigene Split:
  var arr := src.Split([',']);
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
mytbo

Registriert seit: 8. Jan 2007
478 Beiträge
 
#4

AW: Substrings Extract Delimited Values

  Alt 3. Nov 2023, 15:08
Einen wohl auch akzeptabel schnellen Ansatz bietet das bordeigene Split:
  var arr := src.Split([',']);
Richtig! Diese Lösung ist ca. 1/3 schneller als mein Vorschlag. Da der Fragesteller kein Neuling ist und wir nicht wissen, welche zusätzlichen Anforderungen es noch gibt, hat sich mein Vorschlag konkret auf die Frage des Posters und der Verbesserung am Beispiel bezogen. Ich persönlich hätte die mORMot Lösung genommen.

Bis bald...
Thomas
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.314 Beiträge
 
Delphi 12 Athens
 
#5

AW: Substrings Extract Delimited Values

  Alt 3. Nov 2023, 15:43
Das Anfügen an die TStringList benötigt aber ja auch seine Zeit.
Sie haben da schon etwas optimiert und ändern den Speichern nicht bei jedem einzelnen Add,
aber wenn es unbedingt sein muß, dann SL.Capacity := 1000000; vor dem Hinzufügen.
Ein Therapeut entspricht 1024 Gigapeut.
  Mit Zitat antworten Zitat
freimatz

Registriert seit: 20. Mai 2010
1.490 Beiträge
 
Delphi 11 Alexandria
 
#6

AW: Substrings Extract Delimited Values

  Alt 6. Nov 2023, 13:23
Wenn Geschwindigkeit so eine Rolle spielt - was ich mir bei einer DB gar nicht so recht vorstellen kann - dann wäre es eine Idee den String nicht vorgängig aufzusplitten und das Ergebnis zu speichern sondern erst später die String zu extrahieren und gleich zu verwenden.
Und wenn es doch sein muss nicht die ganzen strings zu speichern sondern nur die Start- und End-Positionen im Ausgangsstring.
  Mit Zitat antworten Zitat
Sequitar

Registriert seit: 8. Jan 2016
74 Beiträge
 
Delphi 10.4 Sydney
 
#7

AW: Substrings Extract Delimited Values

  Alt 6. Nov 2023, 16:48
Danke Euch für Eure Vorschläge!
Die Lösung mit
s.split() macht bisher einen guten Eindruck. Die Lösung von Thomas / mytbo werde ich noch prüfen


Zu den spezifischen Anforderungen wäre nur noch zu sagen:
- ich lade zzt eine Liste mit min 50M, max 100M, kommaseparierten (CSV) Einträgen vorberechnteter / vordefinierter Strings aus einer *.zip- Resource
- Ziel: es ist im Anschluss zu prüfen ob ein bestimmter Wert in dieser/n Liste/n vorkommt. Daher (denke ich) müsste ich die Resource bei programmstart durchsuchbar laden
- ich hatte überlegt, zwecks Speicherreduktion die Werte in einem (Binary-)Trie zu speichern (hier werden nicht die kompletten Strings gespeichert) statt in einer Stringlist / Tlist<>. Allerdings muss ich da noch überprüfen, inwiefern da die Geschwindigkeitseinbüßen zum durchsuchen meines Tries relevant sind.
-Ggf hatte ich überlegt, direkt auf Datenbank umzusteigen

Die Resourcen sind derzeit in einem Zip archiv (einzelne *.txt files) hinterlegt, Gäbe es hier eine Möglichkeit, ggf direkt auf den Zipstream zuzugreifen und darin zu suchen - statt extraktion/ übertragung von dort, oder macht das eher keinen Sinn?

Weitere Anforderungen an Format / Speicherung gibt es vorerst keine.>
@himitsu, wahrscheinlich wird es nicht direkt ersichtlich, wie viele Einträge geladen werden. Das könnte ich allerdings hierzu noch anpassen, um die capacity zu setzen
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.599 Beiträge
 
Delphi 12 Athens
 
#8

AW: Substrings Extract Delimited Values

  Alt 6. Nov 2023, 17:04
- Ziel: es ist im Anschluss zu prüfen ob ein bestimmter Wert in dieser/n Liste/n vorkommt. Daher (denke ich) müsste ich die Resource bei programmstart durchsuchbar laden
Delphi-Quellcode:
type
  TMyStrings = class
  private
    FArr: TArray<string>;
  public
    procedure LoadStrings(const Value: string);
    function ContainsItem(const Item: string): Boolean;
  end;

function TMyStrings.ContainsItem(const Item: string): Boolean;
var
  idx: Integer;
begin
  Result := TArray.BinarySearch<string>(FArr, Item, idx);
end;

procedure TMyStrings.LoadStrings(const Value: string);
begin
  FArr := Value.Split([',']);
  TArray.Sort<string>(FArr);
end;
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
Antwort Antwort


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 08:08 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 by Thomas Breitkreuz