На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
Модераторы: jack128, Rouse_, Krid
  
    > String Tokenizing function , Функции "разбиения" строки
      Долго искал в нете данные ф-ции (самлому думать лень было) нашел вот и довел до ума :D. Так что пользуйтесь на здоровье :)
      ExpandedWrap disabled
         
        unit splitfns;
        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[Index] in 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.


      Добавлено в :
      а ну да чуть не забыл пример использования:
      ExpandedWrap disabled
         
        ...
          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[i],adr) then
                words.Add(splited.Strings[i]);
             application.processmessages;//make program to respond to user commands while processing in case of very long string.
          end;
        ...
        M
        Тема перенесена из Delphi: Общие вопросы.
        0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
        0 пользователей:


        Рейтинг@Mail.ru
        [ Script execution time: 0,0172 ]   [ 16 queries used ]   [ Generated: 28.04.24, 10:13 GMT ]