(Gast)
n/a Beiträge
|
Re: String zerlegen
6. Nov 2007, 23:43
hallo alexander,
hab mal kurz die routine ausprobiert, sobald man ein paar anführungszeichen einsetzt, trennt er dennoch... obgleich er da nichts mehr machen dürfte...
IMHO ist die routine auch noch nicht ganz fertig ...
noch viel spass beim weiterentwickeln...
Delphi-Quellcode:
program Project1;
{$APPTYPE CONSOLE}
uses
SysUtils, Classes, Windows ;
{-----------------------------------------------------------------------------
Description: Zerteilt einen String; Zerteilung erfolgt anhand von
Teilstrings, die nicht mit ausgegeben werden
Author: Alexander Roth
Procedure: DivideList
Arguments: s:string; const Separator, DivideList:TStrings
-----------------------------------------------------------------------------}
procedure DivideList(s:string; const Separator, DivideList:TStrings);
function FindNext:TPoint; // sucht den als ersten vorkommenden Seperator
var i:integer;
tempstelle:integer;
schongefunden:boolean; // führe ich ein, damit er auf jeden Fall
// die 1. Fundstelle aufschreibt
begin
schongefunden:=false;
result.y:=0;
result.x:=0;
for i:=0 to Separator.Count-1 do begin
tempstelle:=pos(Separator.Strings[i], s);
//schreibt die als nächstes kommende Trennzeichenstelle auf
if (tempstelle > 0)
and ((tempstelle < result.y) or not schongefunden) then
// es darf niemals sein dass er eine stelle
// aufschreibt die nicht da ist
begin
schongefunden:=true;
result.y:=tempstelle;
result.x:=i;
end;
end;
end;
var tempS:string;
find:TPoint; // y = Fundstelle, x = Index des Separators;
// hier habe ich keinen eigenen Typ gewählt,
// der übersichtlicher wäre, um die Implementierung des
// Codes einfacher zu gestalten
begin
if assigned(Separator) and assigned(DivideList) then
begin
if (s <> '') and (Separator.Count > 0) then // falls man irgendwelche
// schrottige Angaben gemacht hat
// wird man hier rausgeworfen
begin
find:=FindNext;
while (find.y > 0) and (length(s) > 0) do
begin
tempS:=copy(s, 1, find.Y-1);
if length(tempS) > 0 then
DivideList.Append(tempS);
delete(s, 1, find.y-1 + length(Separator[find.x]));
find:=FindNext;
end;
if length(s) > 0 then
DivideList.Append(s);
end;
end;
end;
procedure DemoDivideString;
const s = ',;,''hallo|;guda,ggt;ds|gh,d;'',;";;,f;,g",'; //Ein paar Satzzeichen
var StrList, NewList:TStringlist; //und schon trennt die Routine
i:integer; //unsauber
begin
StrList:=TStringlist.Create;
NewList:=TStringlist.Create;
try
StrList.Append(',');
StrList.Append(';');
StrList.Append('|');
DivideList(s, StrList, NewList);
for i :=0 to NewList.Count-1 do
writeln(I:3, ' ', NewList.Strings[i]);
finally
NewList.free;
StrList.free;
end;
end;
begin
DemoDivideString;
readln;
end.
|
|
Zitat
|