开发者

How to get a specific field from delimited text

开发者 https://www.devze.com 2023-04-10 14:37 出处:网络
开发者_JAVA技巧I have a string of delimited text ie: Value1:Value2:Value3:Value4:Value5:Value6 How would I extract, for example, a specific value Ie:
开发者_JAVA技巧

I have a string of delimited text ie: Value1:Value2:Value3:Value4:Value5:Value6

How would I extract, for example, a specific value Ie: Label.caption := GetValuefromDelimitedText(2); to get Value2

Thanks in advance

Paul


Something like that - if you like compact code (but not as performant as 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;

Hope that helps


This should do it:

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;

This version allows you to specify the separator, you would obviously pass ':'. If you ask for an item beyond the end then the function will return the empty string. You could change that to an exception if you preferred. Finally, I have arranged that this uses 1-based indexing as per your example, but I personally would choose 0-based indexing.


If using Delphi XE or higher you can also use StrUtils.SplitString like this:

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

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

In production code, you should check that Index is indeed a valid index.

This method returns a TStringDynArray (a dynamic array of strings) so you can also use it like this (using enumerators):

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

which can be very useful IMHO.

0

精彩评论

暂无评论...
验证码 换一张
取 消

关注公众号