Thema: Delphi String zerlegen

Einzelnen Beitrag anzeigen

grenzgaenger
(Gast)

n/a Beiträge
 
#13

Re: String zerlegen

  Alt 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.
  Mit Zitat antworten Zitat