Есть ли в старой Delphi 7 функция аналогичная php explode для работы с строками и разбиения их в массив по разделителю?

Взялся поправить один проект на Delphi 7 и там данные приходится много дробить которые по сети приходят чтобы их в нужные места вставить.

Я конечно уже всё сделал на copy pos и тому подобному, только вот получилось что в проекте это по коду занимает как то многовато места. Имею ввиду что copy и pos я использовал чтобы находить нужные фрагменты в строке и копировать их в массив или в нужный компонент, в общем куда нужно копировать...

Неужели не было в той 7-ой Delphi функционала типа php-шного explode? Это бы в раза 2 уменьшило код что я написал... Может есть что? Хочется чтобы код был более читаемый и меньше по размеру.


Ответы (2 шт):

Автор решения: Alex R.

Есть несколько вариантов для доступа к отдельным элементам строки с разделителями.

  1. Функция 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.
  1. Свойство 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)

Параметры:

  1. это Ваша исходная строка string для разделения
  2. string сепаратор(по которому разбиваете)
  3. этим параметром передаёте заранее заготовленную переменную, в которую будет записан результирующий массив
  4. так же переменная в которую будет возвращен результат - сколкьо элементов в массиве, а вернее индекс которого коследний, так же переменную Вам эту нужно заранее создать типа integer

То есть ещё раз обращаю внимание на разницу в php это было бы к примеру explode("a|b","|") вернулся бы массив с индексом 0 и 1 а count от массива показал бы 2. При использовании указанной мной функции в delphi Вы так же получите такой же массив с такими же индексами, вот только outMassLen будет содержать значение 1 а не 2(то есть индекс конечного элемента массива outMass, который Вы передаёте в указанную функцию в Delphi 3-им параметром).

То-есть по Вашему вопросу: процедура explode аналогичная PHP для Delphi уже написана:) хотите используйте, хотите свою процедуру или функцию напишите. А так Вам Alex R. ответил тоже, если не хотите разместить и использовать предложенную процедуру explode.

→ Ссылка