Delphi-PRAXiS
Seite 2 von 5     12 34     Letzte »    

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Problem mit procedure Split() (https://www.delphipraxis.net/160107-problem-mit-procedure-split.html)

ConnorMcLeod 28. Apr 2011 08:42

AW: Problem mit procedure Split()
 
Zitat:

Zitat von FredlFesl (Beitrag 1097309)
Deine Funktion kommt nur mit kurzen Strings klar und ist vom Aufwand O(n^2), weil für jedes Token immer von Anfang an gesucht wird. Ob das Schneller ist, bezweifle ich mal ganz stark.

War auch nur mal als Anfangs-Denkanstoss gedacht. Ich habe auch schon meine eigene Version daraus gemacht, die z.B. nicht immer beim Beginn beginnt, und die macht den Job sehr gut.

Zitat:

Zitat von FredlFesl (Beitrag 1097309)
Im Gegensatz dazu ist die TStringList-Geschichte sehr viel mächtiger, denn sie kommt mit allen Stringtypen und mit in Gänsefüschen eingeschlossenen Texten klar, z.B. wird
Delphi-Quellcode:
a,"b,c",d
in drei Strings ("a", "b,c" und "d") aufgeteilt.

Wenn man das will bzw braucht ... klar. Kann man aber auch in die Parserfunktion hineinprogrammieren, oder?
Zitat:

Zitat von FredlFesl (Beitrag 1097309)
Der Code von TStringlist sieht auch ganz schön flott aus.

Stimmt, aber es hängt eben ein komplettes Objekt hinten dran und das ist für meinen Geschmack *zu* mächtig (mächtig viel Verwaltungsaufwand nämlich). Was das erste Codebeispiel auch verschweigt: einen try-finally-Block brauchen wir korrekterweise noch zusätzlich.

Aber es ist im Endeffekt alles Geschmacksache und der beste Code ist der, der den Job erledigt und vom Kunden bezahlt wird ;-)

himitsu 28. Apr 2011 09:25

AW: Problem mit procedure Split()
 
Nur leider ist die TStringList, bzw. alle Strings-Nachfahren, beim Input, nur auf einen einzelnen String ausgelegt und keine C-Stringliste.

Delphi-Quellcode:
procedure CStringArrayToStringList(const StringArray: String; SL: TStrings);
var
  P: PChar;
begin
  SL.BeginUpdate;
  try
    SL.Clear;
    P := PChar(StringArray);
    if (P^ <> #0) or ((P + 1)^ <> #0) then
      repeat
        SL.Add(P);
        Inc(P, StrLen(P) + 1);
      until P = #0;
  finally
    SL.EndUpdate;
  end;
end;

[unnützes Wissen]
die ResourceStrings werden auch so verwaltet ... jeweils 16 in einem solchen StringArray

blackfin 28. Apr 2011 12:29

AW: Problem mit procedure Split()
 
Hast du mal versucht, deiner Liste die Eigenschaft "StrictDelimiter" auf true zu setzen, bevor zu splittest:

Delphi-Quellcode:
procedure Split(const Delimiter: Char; Input: string; const Strings: TStrings);
begin
   Strings.Clear;  
   Strings.Delimiter := Delimiter;
   Strings.StrictDelimiter:= True; // <--- hier
   Strings.DelimitedText := Input;
end;

Zitat:

TStrings.StrictDelimiter Eigenschaft

Legt fest, wie die Eigenschaft Delimiter verwendet wird.
Klasse
TStrings

Syntax


[Delphi] property StrictDelimiter: Boolean read GetStrictDelimiter write SetStrictDelimiter;


Beschreibung
Mit dieser Eigenschaft legen Sie fest, ob Delimiter der einzige in der Eigenschaft DelimitedText verwendete Wert ist. Bei True werden die einzelnen Strings in DelimitedText nur durch das in Delimiter angegebene Zeichen getrennt. Bei False können die einzelnen Strings in DelimitedText durch ein Leerzeichen, ein nicht druckbares Zeichen oder dem in Delimiter angegebenen Zeichen getrennt werden.

DeddyH 28. Apr 2011 12:32

AW: Problem mit procedure Split()
 
In Delphi 5 gab es noch keinen StrictDelimiter.

uragan 28. Apr 2011 16:20

AW: Problem mit procedure Split()
 
Zitat:

Zitat von himitsu (Beitrag 1097353)
Nur leider ist die TStringList, bzw. alle Strings-Nachfahren, beim Input, nur auf einen einzelnen String ausgelegt und keine C-Stringliste.

Delphi-Quellcode:
procedure CStringArrayToStringList(const StringArray: String; SL: TStrings);
var
  P: PChar;
begin
  SL.BeginUpdate;
  try
    SL.Clear;
    P := PChar(StringArray);
    if (P^ <> #0) or ((P + 1)^ <> #0) then
      repeat
        SL.Add(P);
        Inc(P, StrLen(P) + 1);
      until P = #0;
  finally
    SL.EndUpdate;
  end;
end;

[unnützes Wissen]
die ResourceStrings werden auch so verwaltet ... jeweils 16 in einem solchen StringArray



komisch, bekomme ERROR: Unknown type: 'PChar'
Also wie ich sehe geht es nicht auf diese weise.
Hab versucht mit Pos() gibt auch 0 aus :(


Ist es möglich alle #0 im string zu löschen? oder auf was anderes zu verändern?

mkinzler 28. Apr 2011 16:25

AW: Problem mit procedure Split()
 
PChar ist eigentlich in der System-Unit deklarier, welche automatisch eingebunden wird :gruebel:
Du könntest versuchen die #0 durch einen anderen trenner zu ersetzen (StringReplace())

FredlFesl 28. Apr 2011 17:53

AW: Problem mit procedure Split()
 
Also wenn ich einen PChar habe, und der zeigt auf Strings, die mit #0 voneinander getrennt sind, und zusätzlich habe ich noch die Gesamtlänge des Speicherbereiches, dann liegt es doch nahe, einfach mal durchzulaufen und ein ARRAY OF PCHAR oder eine TList zu erstellen, wenn man auf ein #0 stößt

Delphi-Quellcode:
Function SplitByNullChar (P : PChar; N : Integer) : TList;
Var
  I : Integer;
  C : Char;
Begin
  Result := TList.Create;
  Result.Add(P);
  For I :=1 to N-1 Do begin
    C := P^;
    Inc(P);
    If C=#0 then Result.Add(P);
  End;
End;
Voraussetzung: Hinter dem letzten String ist ein #0.

Danach stehen in der TList lauter PChars, die jeweils auf das erste Zeichen des Tokens zeigen. Terminiert wird dieser String ja durch ein #0, nämlich den nächsten Delimiter.

ConnorMcLeod 28. Apr 2011 18:20

AW: Problem mit procedure Split()
 
Klingt elegant (ausser dass man höllisch aufpassen muss, wer die TList wieder freigibt). Aber soweit ich das verstanden habe MUSS es eine TStringList sein (Aufgabenstellung?). So gesehen läge es auch nahe, eine eigene Ableitung zu machen und im Setter
Delphi-Quellcode:
TMyStrings.SetDelimitedText
die #0 extra freundlich zu behandeln.

uragan 29. Apr 2011 22:29

AW: Problem mit procedure Split()
 
Function SplitByNullChar (P : PChar; N : Integer) : TList;

PChar gibt es nicht :(

EWeiss 29. Apr 2011 22:41

AW: Problem mit procedure Split()
 
Zitat:

Zitat von uragan (Beitrag 1097741)
Function SplitByNullChar (P : PChar; N : Integer) : TList;

PChar gibt es nicht :(

warum PChar und nicht pointer of char

gruss


Alle Zeitangaben in WEZ +1. Es ist jetzt 10:23 Uhr.
Seite 2 von 5     12 34     Letzte »    

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