Как получить конкретное поле из текста с разделителями - PullRequest
1 голос
/ 05 октября 2011

У меня есть строка текста с разделителями, то есть: Value1: Value2: Value3: Value4: Value5: Value6

Как мне извлечь, например, конкретное значение Ie: Label.caption := GetValuefromDelimitedText(2);, чтобы получить Value2

Заранее спасибо

Пол

Ответы [ 3 ]

6 голосов
/ 05 октября 2011

Что-то в этом роде - если вам нравится компактный код (но не такой производительный, как у Davids):

function GetValueFromDelimitedText(const s: string; Separator: char; Index: Integer): string;
var sl : TStringList;
begin
     Result := '';
     sl := TStringList.Create;
     try
        sl.Delimiter := Separator;
        sl.DelimitedText := s;
        if sl.Count > index then 
           Result := sl[index]; 
     finally
            sl.Free;
     end;
end;

Надеюсь, это поможет

3 голосов
/ 05 октября 2011

Это должно сделать это:

function GetValueFromDelimitedText(
    const s: string; 
    const Separator: char; 
    const Index: Integer
): string;
var
  i, ItemIndex, Start: Integer;
begin
  ItemIndex := 1;
  Start := 1;
  for i := 1 to Length(s) do begin
    if s[i]=Separator then begin
      if ItemIndex=Index then begin
        Result := Copy(s, Start, i-Start);
        exit;
      end;
      inc(ItemIndex);
      Start := i+1;
    end;
  end;
  if ItemIndex=Index then begin
    Result := Copy(s, Start, Length(s)-Start+1);
  end else begin
    Result := '';
  end;
end;

В этой версии вы можете указать разделитель, вы, очевидно, передадите ':'.Если вы запросите элемент за концом, то функция вернет пустую строку.Вы можете изменить это на исключение, если вы предпочитаете.Наконец, я договорился, что в этом примере используется индексация на основе 1, но лично я бы выбрал индексацию на основе 0.

2 голосов
/ 08 октября 2011

Если вы используете Delphi XE или выше, вы также можете использовать StrUtils.SplitString, например:

function GetValueFromDelimitedText (const Str: string; Separator: Char; Index: Integer) : string;

begin
Result := SplitString (Str, Separator) [Index];
end;

В рабочем коде вы должны проверить, что Index действительно допустимый индекс.

Этот метод возвращает TStringDynArray (динамический массив строк), поэтому вы также можете использовать его следующим образом (используя перечислители):

for Str in SplitString (Str, Separator) do
  Writeln (Str);

что может быть очень полезно ИМХО.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...