AGB  ·  Datenschutz  ·  Impressum  







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

Problem mit procedure Split()

Ein Thema von uragan · begonnen am 27. Apr 2011 · letzter Beitrag vom 1. Mai 2011
Antwort Antwort
Seite 1 von 5  1 23     Letzte »    
uragan

Registriert seit: 27. Apr 2011
12 Beiträge
 
#1

Problem mit procedure Split()

  Alt 27. Apr 2011, 21:20
Delphi-Version: 5
Hallo

Ich hoffe ich bin hier richtig.
Ich hab ein kleines problem mit der Funktion Split()

was ist den hier falsch?, wieso bekomme ich das ganze nicht gesplittet?

Delphi-Quellcode:
program uragan;

var
list: TStringList;
s : string;
i : integer;

procedure Split(const Delimiter: Char; Input: string; const Strings: TStrings);
begin
   Strings.Clear;
   Strings.Delimiter := Delimiter;
   Strings.DelimitedText := Input;
end;



begin
list := TStringList.create;
s := 'blabla' + HStr('00') + 'blabla2' + HStr('00') + 'blabla3' + HStr('00') + 'blabla4' + HStr('00') + 'blabla5' + HStr('00') ;
Split(HStr('00'), s, list);
for i := 0 to list.count-1 do begin
ShowMessage(list[i]);
end;

end.
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.861 Beiträge
 
Delphi 11 Alexandria
 
#2

AW: Problem mit procedure Split()

  Alt 27. Apr 2011, 21:30
Was kommt den raus?
Markus Kinzler
  Mit Zitat antworten Zitat
Klaus01

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

AW: Problem mit procedure Split()

  Alt 27. Apr 2011, 21:38
Guten Abend,

was macht denn HStr('00')?
Ist es das gleiche wie #0?

Warum sind Strings in der Paramterliste der Prozedur split als const deklariert?

Grüße
Klaus
Klaus
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#4

AW: Problem mit procedure Split()

  Alt 27. Apr 2011, 22:35
changed..

gruss

Geändert von EWeiss (28. Apr 2011 um 03:04 Uhr)
  Mit Zitat antworten Zitat
uragan

Registriert seit: 27. Apr 2011
12 Beiträge
 
#5

AW: Problem mit procedure Split()

  Alt 27. Apr 2011, 22:45
Was kommt den raus?
Es kommen 2 arrays

array0 = blabla
array1 = ?? ist frei, wahrscheinlich #0
mehr kommt nicht

wenn ich Split string ändere, zb auf ","dann klappt es, es muss aber HStr('00')bzw #0 sein
  Mit Zitat antworten Zitat
Benutzerbild von ConnorMcLeod
ConnorMcLeod

Registriert seit: 13. Okt 2010
Ort: Bayern
490 Beiträge
 
Delphi 10.4 Sydney
 
#6

AW: Problem mit procedure Split()

  Alt 28. Apr 2011, 05:13
Hallo,

es kommen nicht *zwei Arrays*, sondern zwei Einträge in einer TStringList. Einer gleicht 'blabla' und einer ist ein Leerstring.

Mach einen Breakpoint auf
Strings.DelimitedText := Input;
und steppe mal mit F7 durch. Dann wird Dir klar, was passiert. Kurz gesagt: #0 geht halt nicht.

Antwort1) der Delimiter darf bei dieser Vorgehensweise nicht #0 sein.
Antwort2) eine TStringList für diesen Zweck zu verwenden ist super praktisch und super Performance fressend.

Mir hat eine Funktion auf Stackoverflow ganz gut gefallen:

Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
const
  MYDELIMITER = #0;
var
  s : string;
  sTok: string;
  i : integer;

  function GetTok(const Line: string; const Delim: Char; const TokenNum: Byte): string;
  { LK Nov 8, 2009 - Reoptimized using PChars instead of calls to Pos and PosEx }
  { See; http://stackoverflow.com/questions/1694001/is-there-a-fast-gettoken-routine-for-delphi }
  var
    I, CurToken: Integer;
    PLine, PStart: PChar;
  begin
    CurToken := 1;
    PLine := PChar(Line);
    PStart := PLine;
    for I := 1 to length(Line) do begin
      if PLine^ = Delim then begin
        if CurToken = TokenNum then
          break
        else begin
          CurToken := CurToken + 1;
          inc(PLine);
          PStart := PLine;
        end;
      end
      else
        inc(PLine);
    end;
    if CurToken = TokenNum then
      SetString(Result, PStart, PLine - PStart)
    else
      Result := '';
  end;

begin
  s := 'blabla' + MYDELIMITER + 'blabla2' + MYDELIMITER + 'blabla3' + MYDELIMITER + 'blabla4' + MYDELIMITER + 'blabla5' + MYDELIMITER ;

  i := 1;
  sTok := GetTok(s, MYDELIMITER, i);
  while ('' <> sTok) do
  begin
    ShowMessage(sTok);
    inc(i);
    sTok := GetTok(s, MYDELIMITER, i);
  end;
end;
HTH
  Mit Zitat antworten Zitat
FredlFesl

Registriert seit: 19. Apr 2011
293 Beiträge
 
Delphi 2009 Enterprise
 
#7

AW: Problem mit procedure Split()

  Alt 28. Apr 2011, 07:56
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.
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 a,"b,c",d in drei Strings ("a", "b,c" und "d") aufgeteilt.

Der Code von TStringlist sieht auch ganz schön flott aus.
  Mit Zitat antworten Zitat
Klaus01

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

AW: Problem mit procedure Split()

  Alt 28. Apr 2011, 08:38
..alternativ könntest Du auch mal diese Explode-Prozedur oder diese explode Funktion testen.

Grüße
Klaus
Klaus
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

AW: Problem mit procedure Split()

  Alt 28. Apr 2011, 08:52
Wer eine Stringliste als Splitter nutzt, der sollte sich von #0 als Trenner verabschieden.
Alles, was intern PChar nutzt oder eine Kompatibilität zu diesem bietet, das kann nich genutzt werden.

#0 = Textende

also weiter macht die Stringliste auch nicht
$2B or not $2B
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.861 Beiträge
 
Delphi 11 Alexandria
 
#10

AW: Problem mit procedure Split()

  Alt 28. Apr 2011, 09:24
Es scheint sich aber um eine C-Stringliste zu handeln. Dort wird m.W. #0 als Trenner verwendet
Markus Kinzler
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 5  1 23     Letzte »    


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 15: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