2011-10-05 20 views
1

得到一個特定的領域我有分隔文本即一個字符串: 值1:值2:值3:值4:值5:Value6如何從分隔的文本

我將如何提取,例如,一個特定的值,即: Label.caption := GetValuefromDelimitedText(2);獲得值2

在此先感謝

保羅

回答

3

這應做到:

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的索引。

+1

+1。基於'TStringList'的方法我更喜歡這個。 –

+0

@Andreas謝謝。這種方法源於我對堆分配的過敏。但在這種情況下它可能是矯枉過正的。 –

+0

只要您不必擔心在其中一個值中顯示的分隔符(作爲引用值或轉義分隔符),此工作正常。這是我唯一保留「自己動手」與使用RTL中已有的功能的關係。 – afrazier

6

類似的東西 - 如果你喜歡緊湊的代碼(但不作爲高性能的戴維斯):

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; 

希望幫助

+2

+1,但你應該將'StrictDelimiter'設置爲'True',否則空格也會被解釋爲分隔符。 – jpfollenius

+0

@Smasher,是的,但'StrictDelimiter'及其不連貫的行爲是D2010 +特有的,所以應該有'$ IF Declared',我會去'ExtractStrings'獲得更友好的代碼。 –

+0

@Premature優化:關於'StrictDelimiter'什麼是「不一致」? – afrazier

2

如果採用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); 

其可以是非常有用的IMHO。

+0

簡單而強大。 – truthseeker