Delphi - база знаний

       

Парсинг строк


Парсинг строк



unitsplitfns;
interface
uses Classes, Sysutils;
function GetNextToken
   (Const S: string;
   Separator: TSysCharSet;
   var StartPos: integer): String;



{Returns the next token (substring)
from string S, starting at index
StartPos and ending 1 character
before the next occurrence of
Separator (or at the end of S,
whichever comes first).}
{StartPos returns the starting
position for the next token, 1
more than the position in S of
the end of this token}

procedure Split
   (const S: String;
   Separator: TSysCharSet;
   MyStringList: TStringList);

{Splits a string containing designated
separators into tokens and adds
them to MyStringList NOTE: MyStringList
must be Created before being passed to this
procedure and Freed after use}

function AddToken
   (const aToken, S: String;
   Separator: Char;
   StringLimit: integer): String;

{Used to join 2 strings with a
separator character between them and
can be used in a Join function}
{The StringLimit parameter prevents
the length of the Result String
from exceeding a preset maximum}


implementation

function GetNextToken
   (Const S: string;
   Separator: TSysCharSet;
   var StartPos: integer): String;
var Index: integer;
begin
   Result := '';

{Step over repeated separators}
   While (S[StartPos] in Separator)
   and (StartPos <= length(S))do
    StartPos := StartPos + 1;

   if StartPos > length(S) then Exit;

{Set Index to StartPos}
   Index := StartPos;

{Find the next Separator}
   While not (S[Indexin Separator)
   and (Index <= length(S))do
    Index := Index + 1;

{Copy the token to the Result}
   Result := Copy(S, StartPos, Index - StartPos);

{SetStartPos to next Character after the Separator}
   StartPos := Index + 1;
end;

procedure Split
   (const S: String;
   Separator: TSysCharSet;
   MyStringList: TStringList);
var Start: integer;
begin
   Start := 1;
   While Start <= Length(S) do
     MyStringList.Add
       (GetNextToken(S, Separator, Start));
end;

function AddToken (const aToken, S: String;
                    Separator: Char;
                    StringLimit: integer): String;
begin
   if Length(aToken) + Length(S) < StringLimit then
     begin
       {Add a separator unless the
        Result string is empty}
       if S = '' then
         Result := ''
       else Result := S + Separator;

       {Add the token}
       Result := Result + aToken;
     end
   else
   {if the StringLimit would be
   exceeded, raise an exception}
     Raise Exception.Create('Cannot add token');
end;
end


пример использования:


...
  data:= TStringList.Create;
  splited:=TStringList.Create;
  data.LoadFromFile(s);
  Split(data.Text,[',',' ',#10,#13,';','\"','.','!','-','+','*','/','\',
  '(',')','[',']','{','}','<','>','''','"','?','"','#',#0],splited);
  for i:= 0 to splited.Count-1 do
  begin
     if not words.Find(splited.Strings,adr) then
        words.Add(splited.Strings[i]);
     application.processmessages;[i]//make program to respond to user commands while processing in case of very long string.
 end;
...



Автор:

Song

Взято из






Содержание раздела