Есть ли в старой Delphi 7 функция аналогичная php explode для работы с строками и разбиения их в массив по разделителю?
Взялся поправить один проект на Delphi 7 и там данные приходится много дробить которые по сети приходят чтобы их в нужные места вставить.
Я конечно уже всё сделал на copy pos и тому подобному, только вот получилось что в проекте это по коду занимает как то многовато места. Имею ввиду что copy и pos я использовал чтобы находить нужные фрагменты в строке и копировать их в массив или в нужный компонент, в общем куда нужно копировать...
Неужели не было в той 7-ой Delphi функционала типа php-шного explode? Это бы в раза 2 уменьшило код что я написал... Может есть что? Хочется чтобы код был более читаемый и меньше по размеру.
Ответы (2 шт):
Есть несколько вариантов для доступа к отдельным элементам строки с разделителями.
- Функция
SplitStringдля преобразования в массив строк
uses
SysUtils, StrUtils, Types;
var
vList: TStringDynArray;
i: Integer;
begin
vList := SplitString('Один; Два; Три', ';');
for i := Low(vList) to High(vList) do
WriteLn(Trim(vList[i]));
ReadLn;
end.
- Свойство
DelimitedTextклассаTStringsдля представления в виде списка строк
uses
SysUtils, StrUtils, Classes;
var
vList: TStrings;
i: Integer;
begin
vList := TStringList.Create;
try
vList.Delimiter := ';';
//vList.StrictDelimiter := True; //вроде с D2006
vList.DelimitedText := 'Один; Два; Три';
for i := 0 to vList.Count - 1 do
WriteLn(Trim(vList[i]));
finally
vList.Free;
end;
ReadLn;
end.
По ссылке - http://blog.ivru.net/?id=195 есть самописная функция explode, близкая по аналогии к php.
procedure myExplode(sourceText: string; separator: string; var outMass: array of string; var outMassLen: integer);
var position,separatorLen: integer;
begin
outMassLen:= 0;//Количеству элементов выходного массива присвоим 0(в любом случаи выходной массив будет содержать как минимум элемент с индексом 0, такой результат будет если разделитель не будет найден в исходном тексте вовсе)
separatorLen:= Length(separator);//Определяем длину разделителя
Repeat//Цикл с постусловием
position:= Pos(separator,sourceText);//Пробуем найти позицию вхождения разделителя в исходный текст(или очередной фрагмент исходного текста)
if (position <> 0) then//Если найдена позиция вхождения разделителя в исходный текст(или очередной фрагмент исходного текста)
begin
outMass[outMassLen]:= Copy(sourceText,1,position-1);//Добавим в массив участно
sourceText:= Copy(sourceText,position+separatorLen,(Length(sourceText)-position-separatorLen+1));//Теперь исходный текст будет начинаться с следующего фрагмента
Inc(outMassLen);//Увеличиваем значение на 1
end;
Until (position = 0);//Здесь условие выхода из цикла а не продолжения
outMass[outMassLen]:= sourceText;//Добавим в массив последний участок или весь исходный текст если разделитель не был найден вовсе
end;
Только если вдруг её будите использовать, то обратите внимание что количество элементов считается в ней иначе.
Функция принимает 4 параметра:
myExplode(sourceText: string; separator: string; var outMass: array of string; var outMassLen: integer)
Параметры:
- это Ваша исходная строка string для разделения
- string сепаратор(по которому разбиваете)
- этим параметром передаёте заранее заготовленную переменную, в которую будет записан результирующий массив
- так же переменная в которую будет возвращен результат - сколкьо элементов в массиве, а вернее индекс которого коследний, так же переменную Вам эту нужно заранее создать типа integer
То есть ещё раз обращаю внимание на разницу в php это было бы к примеру explode("a|b","|") вернулся бы массив с индексом 0 и 1 а count от массива показал бы 2. При использовании указанной мной функции в delphi Вы так же получите такой же массив с такими же индексами, вот только outMassLen будет содержать значение 1 а не 2(то есть индекс конечного элемента массива outMass, который Вы передаёте в указанную функцию в Delphi 3-им параметром).
То-есть по Вашему вопросу: процедура explode аналогичная PHP для Delphi уже написана:) хотите используйте, хотите свою процедуру или функцию напишите. А так Вам Alex R. ответил тоже, если не хотите разместить и использовать предложенную процедуру explode.