得到一個特定的領域我有分隔文本即一個字符串: 值1:值2:值3:值4:值5:Value6如何從分隔的文本
我將如何提取,例如,一個特定的值,即: Label.caption := GetValuefromDelimitedText(2);
獲得值2
在此先感謝
保羅
得到一個特定的領域我有分隔文本即一個字符串: 值1:值2:值3:值4:值5:Value6如何從分隔的文本
我將如何提取,例如,一個特定的值,即: Label.caption := GetValuefromDelimitedText(2);
獲得值2
在此先感謝
保羅
這應做到:
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的索引。
類似的東西 - 如果你喜歡緊湊的代碼(但不作爲高性能的戴維斯):
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;
希望幫助
+1,但你應該將'StrictDelimiter'設置爲'True',否則空格也會被解釋爲分隔符。 – jpfollenius
@Smasher,是的,但'StrictDelimiter'及其不連貫的行爲是D2010 +特有的,所以應該有'$ IF Declared',我會去'ExtractStrings'獲得更友好的代碼。 –
@Premature優化:關於'StrictDelimiter'什麼是「不一致」? – afrazier
如果採用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。
簡單而強大。 – truthseeker
+1。基於'TStringList'的方法我更喜歡這個。 –
@Andreas謝謝。這種方法源於我對堆分配的過敏。但在這種情況下它可能是矯枉過正的。 –
只要您不必擔心在其中一個值中顯示的分隔符(作爲引用值或轉義分隔符),此工作正常。這是我唯一保留「自己動手」與使用RTL中已有的功能的關係。 – afrazier