Аналог string s.Split(..) в Delphi

  • Автор темы ppkp
  • 7477
  • Обновлено
  • 17, Dec 2009
  • #2
Спасибо, Совсем забыл про эти properties. Только подправил List.Delimiter := ','; List.QuoteChar := '"'; List.DelimitedText := '"asa. sds bb","aaa «Delphi» cc",4.6,5.00,3'; Но это работает только с одним типом Delimiter, а универсальности нет. Спасибо большое.
 

ppkp


Рег
11 May, 2006

Тем
1

Постов
3

Баллов
13
  • 21, Dec 2009
  • #3
Вот еще function StringSplit(Str,Delim:String):TStrings; var I,Start,Count: Integer; begin Result := TStringList.Create; Start := 1; I := 1; Count := 0; While I < Length(Str) do begin if Copy(Str,I,Length(Delim)) = Delim then begin Result.Add(Copy(Str,Start,I - Start)); I := I + Length(Delim); Start := I; end else I := I + 1; end; if Length(Str) > 0 then Result.Add(Copy(Str,Start,Length(Str))); end;
 

brs


Рег
12 Oct, 2006

Тем
1

Постов
2

Баллов
12
  • 21, Dec 2009
  • #4
Спасибо, большое спасибо. В принципе вариант с TStrings.DelimitedText подходит для всех нужных типов разделителей. А с TStringGrid Вы работали ? Мне необходимо перетащить Selected в другое место этой же таблицы (a-la Excel).
 

ppkp


Рег
11 May, 2006

Тем
1

Постов
3

Баллов
13
  • 23, Apr 2010
  • #5
Here some Code I usually Use I Hope this will be help you

type
TStringArray = array of String;

function BuffTextEqualAsm(const Str1, Str2: PChar; MaxLen: Cardinal): Boolean; assembler;
asm
PUSH EDI
PUSH ESI
PUSH EBX
MOV EDI,EDX
MOV ESI,EAX
MOV EBX,ECX
XOR EAX,EAX
OR ECX,ECX
JE @@T
REPNE SCASB
SUB EBX,ECX
MOV ECX,EBX
MOV EDI,EDX
XOR EDX,EDX
@@1:
REPE CMPSB
JE @@T
MOV AL,[ESI-1]
CMP AL,'a'
JB @@2
CMP AL,'z'
JA @@2
SUB AL,20H
@@2:
MOV DL,[EDI-1]
CMP DL,'a'
JB @@3
CMP DL,'z'
JA @@3
SUB DL,20H
@@3:
SUB EAX,EDX
JE @@1
@@F:
xor EAX,EAX
jmp @@E
@@T:
mov EAX,1
@@E:
POP EBX
POP ESI
POP EDI
end;

function IndexedWithToken(const Src: String;const Index: Integer;Token:String = ','): String;
var
P, Start : PChar;
tkLength : Integer;
LocalIndex : Integer;
begin
Result := '';
LocalIndex := 1;
tkLength := Length(Token);
P := Pointer(Src);
Start := P;
if Index <= 0 then Exit;

if P <> nil then begin
while P^ <> #0 do
begin
while Not ((P^ In [#0]) or BuffTextEqualAsm(P,Pointer(Token),tkLength)) do Inc(P);
if P <> Start then
begin
if LocalIndex = Index then
begin
SetString(Result, Start, Integer(P - Start));
Exit;
end;
end;
if P^ = #0 then break;
Inc(LocalIndex);
Inc(P,tkLength);
Start := P;
end;
end;
if P <> Start then
begin
if LocalIndex = Index then
begin
SetString(Result, Start, Integer(P - Start));
Exit;
end;
end;
end;

procedure StringSplit(SourceStr,SplitStr: string;var SplitStrs: TStringArray);
var
i: Integer;
str: string;
begin
i := 1;
while True do
begin
str := IndexedWithToken(SourceStr,i,SplitStr);
if str <> '' then
begin
SetLength(SplitStrs,i);
SplitStrs[i-1] := str;
end
else Break;
Inc(i);
end;
end;
 

dxsoft


Рег
23 Apr, 2010

Тем
0

Постов
1

Баллов
1
  • 05, Jan 2011
  • #6
list.Delimiter:=';'; - к сожалению еще пробелы всегда за разделитель считает и новую строку.
 

Alexonix


Рег
18 Nov, 2010

Тем
0

Постов
2

Баллов
2
  • 15, Jun 2011
  • #7
{ Заполняет список List словами, выделенных из строки S, разделителями слов являются любое кол-во символов из множества Delimiters. Возвращает List.

Чтобы можно было писать примерно следующим образом

sl := FillWordsList(SomeStr, SomeDelim, TStringList.Create);

try

Do something

finally

sl.Free;

end;

}

function FillWordsList(const S: string; const Delimiters: TSysCharSet; List: TStrings): TStrings;

var

I, J, Len: Integer;

Word: string;

begin

Assert(List <> nil); Len := Length(S); I := 1; List.BeginUpdate; try while I <= Len do begin {прогнать token} J := I; while (I <= Len) and not (S in Delimiters) do
Inc(I);

{ if I = J then
Break;}

Word := Trim(Copy(S, J, I - J));

if Word <> '' then
List.Add(Word);

{прогнать delimiters}
while (I <= Len) and (S in Delimiters) do
Inc(I);
end;

finally
List.EndUpdate;
end;

Result := List;
end;
 

cg_shura


Рег
16 Oct, 2008

Тем
0

Постов
2

Баллов
2
  • 08, Jul 2011
  • #8
Alexonix, post: 709389:
к сожалению еще пробелы всегда за разделитель считает и новую строку
следует выставить TStrings.StrictDelimiter в False (идиотская фича новых RTL) а вообще я бы посоветовал функцию SysUtils.ExtractStrings как максимально гибкий способ это сделать
 

ADnh47adhn


Рег
30 Mar, 2009

Тем
0

Постов
1

Баллов
1
Тем
49554
Комментарии
57426
Опыт
552966

Интересно