Code:

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;

varIndex: 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}

Whilenot (S[Index] in Separator) and (Index <= length(S))doIndex := 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.

 

 

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

 

Code:

...

data:= TStringList.Create;

splited:=TStringList.Create;

data.LoadFromFile(s);

Split(data.Text,[',',' ',#10,#13,';','\"','.','!','-','+','*','/','\',

'(',')','[',']','{','}','<','>','''','"','?','"','#',#0],splited);

for i:= 0to splited.Count-1do

begin

ifnot 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

Взято из https://forum.sources

 

 


 

 

Некоторое время назад одна любезная душа прислала мне этот модуль. Я нашел его весьма полезным, но применять его вам надлежит с некоторой долей осторожности, ибо тэг %s иногда приводит к исключительным ситуациям.

 

Code:

unit Scanf;

 

interface

uses SysUtils;

 

type

 

EFormatError = class(ExCeption);

 

function Sscanf(const s: string; const fmt: string;

const Pointers: arrayof Pointer): Integer;

implementation

 

{ Sscanf выполняет синтаксический разбор входной строки. Параметры...

 

s - входная строка для разбора

fmt - 'C' scanf-форматоподобная строка для управления разбором

%d - преобразование в Long Integer

%f - преобразование в Extended Float

%s - преобразование в строку (ограничено пробелами)

другой символ - приращение позиции s на "другой символ"

пробел - ничего не делает

Pointers - массив указателей на присваиваемые переменные

 

результат - количество действительно присвоенных переменных

 

Например, ...

Sscanf('Name. Bill Time. 7:32.77 Age. 8',

'. %s . %d:%f . %d', [@Name, @hrs, @min, @age]);

 

возвратит ...

Name = Bill hrs = 7 min = 32.77 age = 8 }

 

function Sscanf(const s: string; const fmt: string;

 

const Pointers: arrayof Pointer): Integer;

var

 

i, j, n, m: integer;

s1: string;

L: LongInt;

X: Extended;

 

function GetInt: Integer;

begin

s1 := '';

while (s[n] = ' ') and (Length(s) > n) do

inc(n);

while (s[n] in ['0'..'9', '+', '-'])

and (Length(s) >= n) do

begin

s1 := s1 + s[n];

inc(n);

end;

Result := Length(s1);

end;

 

function GetFloat: Integer;

begin

s1 := '';

while (s[n] = ' ') and (Length(s) > n) do

inc(n);

while (s[n] in ['0'..'9', '+', '-', '.', 'e', 'E'])

and (Length(s) >= n) do

begin

s1 := s1 + s[n];

inc(n);

end;

Result := Length(s1);

end;

 

function GetString: Integer;

begin

s1 := '';

while (s[n] = ' ') and (Length(s) > n) do

inc(n);

while (s[n] <> ' ') and (Length(s) >= n) do

begin

s1 := s1 + s[n];

inc(n);

end;

Result := Length(s1);

end;

 

function ScanStr(c: Char): Boolean;

begin

while (s[n] <> c) and (Length(s) > n) do

inc(n);

inc(n);

 

if (n <= Length(s)) then

Result := True

else

Result := False;

end;

 

function GetFmt: Integer;

begin

Result := -1;

 

while (TRUE) do

begin

while (fmt[m] = ' ') and (Length(fmt) > m) do

inc(m);

if (m >= Length(fmt)) then

break;

 

if (fmt[m] = '%') then

begin

inc(m);

case fmt[m] of

'd': Result := vtInteger;

'f': Result := vtExtended;

's': Result := vtString;

end;

inc(m);

break;

end;

 

if (ScanStr(fmt[m]) = False) then

break;

inc(m);

end;

end;

 

begin

 

n := 1;

m := 1;

Result := 0;

 

for i := 0to High(Pointers) do

begin

j := GetFmt;

 

case j of

vtInteger:

begin

if GetInt > 0then

begin

L := StrToInt(s1);

Move(L, Pointers[i]^, SizeOf(LongInt));

inc(Result);

end

else

break;

end;

 

vtExtended:

begin

if GetFloat > 0then

begin

X := StrToFloat(s1);

Move(X, Pointers[i]^, SizeOf(Extended));

inc(Result);

end

else

break;

end;

 

vtString:

begin

if GetString > 0then

begin

Move(s1, Pointers[i]^, Length(s1) + 1);

inc(Result);

end

else

break;

end;

 

else

break;

end;

end;

end;

 

end.

 

 

 

https://delphiworld.narod.

DelphiWorld 6.0

 

 

 

Code:

// Parse a string, for example:

// How do I get the "B" from "A|B|C|D|E|F"?

 

function Parse(Char, S: string; Count: Integer): string;

var

I: Integer;

T: string;

begin

if S[Length(S)] <> Char then

S := S + Char;

for I := 1to Count do

begin

T := Copy(S, 0, Pos(Char, S) - 1);

S := Copy(S, Pos(Char, S) + 1, Length(S));

end;

Result := T;

end;

 

procedure TForm1.Button1Click(Sender: TObject);

begin

ShowMessage(Parse('|', 'A|B|C|D|E|F', 2));

end;

 

{

Parameters:

 

Parse([Character, for example "|"], [The string],

[The number, the "B" is the 2nd part of the string]);

 

This function is handy to use when sending data over the internet,

for example a chat program: Name|Text. Note: Be sure there's no "Char" in the string!

Use a unused character like "|" or "?".

}

 

 

Взято с сайта: https://www.swissdelphicenter

Добавить комментарий

Не использовать не нормативную лексику.

Просьба писать ваши замечания, наблюдения и все остальное,
что поможет улучшить предоставляемую информацию на этом сайте.

ВСЕ КОММЕНТАРИИ МОДЕРИРУЮТСЯ ВРУЧНУЮ, ТАК ЧТО СПАМИТЬ БЕСПОЛЕЗНО!


Защитный код
Обновить