| Автор
| Сообщение |
 TuXAPuK
Великий гонщик


Возраст: 26
Знак зодиака: 
Зарегистрирован: 12.09.2005
Сообщения: 714
Откуда: Великий город Рига... =Ъ
|
|
|
Цитата |
|
Вот оставляю её тут на хранение, а то у меня на винтах бы затерялась...
Функция разбивки строки.
function Explode(sString, sExploader: string; out sOutArray: TStringDynArray; out iArraySize: integer): boolean;
Результат : Если строка разбивалась то вернёт true, в ином случае false.
sString : Строка которую следует разбить.
sExploader : Текст которым разбивается строка.
sOutArray : Массив строк в который будут помещаться разбитые строки.
iArraySize : Размер массива разбитых строк.
Код обновлён 10.05.2008
| Pascal: | uses StrUtils; type TStringDynArray = array of string; function Explode(sString, sExploader: string; out sOutArray: TStringDynArray; [color=blue]out[/color] iArraySize: integer): boolean; var iStrLen : Word; iExplLen : Word; sSubStr : String; iX : Word; iPos : Word; begin Result := False; // Считаем количество элементов Exploader в String iStrLen := Length(sString); iExplLen := Length(sExploader); iArraySize := 1; if ( iStrLen > iExplLen) then begin iPos := 0; while ( true ) do begin iPos := PosEx(sExploader, sString, iPos + 1); if (iPos <> 0) then begin iArraySize := iArraySize + 1; iPos := iPos + iExplLen - 1; end else break; end; end; // Разбераем строку SetLength(sOutArray, iArraySize); if (iArraySize <> 1) then begin for iX := 0 to iArraySize - 1 do begin iPos := Pos(sExploader, sString); if (iPos <> 0) then begin sOutArray[iX] := Copy(sString, 1, iPos - 1); sString := Copy(sString, iPos + iExplLen, Length(sString) - iPos - iExplLen + 1); end else sOutArray[iX] := sString; end; Result := True; end else sOutArray[0] := sString; end;
|
зЫ : Хотел-бы видеть комментарии по оптимизации кода, есть идеи? _________________

Последний раз редактировалось: TuXAPuK (Вт, 30-Ноя-2010 17:44), всего редактировалось 5 раз(а) |
|
| В начало |
|
 |
|
|
 |
DrPass
Знающий :) /Почетный Модератор/

Возраст: 31
Знак зодиака: 
Зарегистрирован: 02.05.2002
Сообщения: 5709
Откуда: Донецк
|
|
|
Цитата |
|
| Цитата: | if ( iStrLen > iExplLen) then
for iX := 1 to (iStrLen - iExplLen) do
begin
sSubStr := Copy(sString, iX, iExplLen);
if (sSubStr = sExploader) then iArraySize := iArraySize + 1;
end; |
Заменить на while c использованием PosEx и позиции поиска. Это и заметно быстрее, и избавит твою процедуру от душевных мук при обработке параметров вида sString='111111111111111111', sExploader='111'
Для оптимизации по скорости можно еще сделать два режима - цикл for если length(sExploader)=1 и while, если больше 1 _________________ Да пребудет с вами Сила! |
|
| В начало |
|
 |
 TuXAPuK
Великий гонщик


Возраст: 26
Знак зодиака: 
Зарегистрирован: 12.09.2005
Сообщения: 714
Откуда: Великий город Рига... =Ъ
|
|
|
Цитата |
|
Спасибо... Как-то даже и мысли не было о такой строчке.... _________________
 |
|
| В начало |
|
 |
Hunter
Энтузиаст

Зарегистрирован: 14.09.2006
Сообщения: 349
|
|
|
Цитата |
|
| delphi: | procedure Explode(Text, Delimiter: string):TStringlist; begin result:=TStringList.Create(); result.Text:=ReplaceString(Text, Delimiter, result.Delimiter, [rsReplaceAll]); end;
|
В принципе, можно было и одной строкой все реализовать.. =)
Добавлено спустя 14 минут 57 секунд:
Вот еще один алгоритм:
| delphi: | function SeparateStrings(sText, sSeparator: string): array of string; var n, l, sl: integer; begin sl:=Length(sSeparator); n:=Pos(sSeparator, sText); l:=1; while n > 0 do begin SetLength(result, l); result[l-1]:=Copy(sText, 1, n-1); sText:=Copy(sText, n+sl, maxint); n:=Pos(sSeparator, sText); Inc(l); end; SetLength(result, l); result[l-1]:=sText; end;
|
Добавлено спустя 2 минуты 39 секунд:
И еще. Это довольно специфичный вариант, но полезный для разбития строк, которые могут содержать разделитель. Например, формат CSV.
| delphi: | // Парсит строку с пробелами, с учетом двойных кавычек (") // bAddEmpty - признак добавления пустых строк function ParseStr(s: String; bAddEmpty: boolean = false): TStringArray; var i,l,rl: integer; InBracket: boolean; TmpStr: String; procedure AddStr; begin if (TmpStr='') and (not bAddEmpty) then Exit; Inc(rl); SetLength(result, rl); result[rl-1]:=TmpStr; TmpStr:=''; end; begin i:=0; l:=Length(s); rl:=0; InBracket:=false; TmpStr:=''; SetLength(result, rl); while i<l do begin Inc(i); case s[i] of ' ': if not InBracket then AddStr() else TmpStr:=TmpStr+s[i]; '"': begin if (i+1<l) and (s[i+1]='"') then begin // two brackets as one bracket TmpStr:=TmpStr+'"'; Inc(i); continue; end; if InBracket then begin InBracket:=false; AddStr(); end else begin InBracket:=true; continue; end; end; else // normal char TmpStr:=TmpStr+s[i]; end; end; AddStr(); end;
|
_________________ Никому не двигаться, у меня дракон! |
|
| В начало |
|
 |
|