求个和 TStringlist.CommaText属性具有同样功能的函数(200)

  • 主题发起人 主题发起人 delhpi
  • 开始时间 开始时间
D

delhpi

Unregistered / Unconfirmed
GUEST, unregistred user!
TStringlist.CommaText就是逗号分隔的字符串如果把符合格式的字符串,比如,"第一个 项目","第二个,项目","第三""个"赋值给CommaText,则TStringlist就自动分成3个项第一个 项目第二个,项目第三"个然后就可以通过TStringlist.Strings[x]来取得需要的值了。现在想用函数实现这个功能。传入要分析的字符串,分隔字符,引号字符,要取的项目索引返回相应的项目字符function xx (S:String;Delimiter: Char;QuoteChar: Char;I:Integer):String;
 
有个ExtractStrings函数,如果不合要求就只好自己写了
 
这个函数也需要一个TStringlist
 
你把 TStringList 的 SetCommaText 复制出来再改改就是了,这都不会?
 
呵呵 估计没有本事改好
 
uses SysUtils;function xx (S:String;Delimiter: Char;QuoteChar: Char;I:Integer):String;var j,k,l,m: Integer; str,ptr: PChar;begin Result := ''; str := PChar(Pointer(S)); ptr := StrScan(str,Delimiter); j := -1; while True do begin Inc(j); if ptr = nil then begin if (j = I) then Result := Copy(S,str - PAnsiChar(S) + 1, Length(S) - (str - PAnsiChar(S))); Exit; end; if (j = I) then Result := Copy(S,str - PAnsiChar(S) + 1,ptr - str) else begin str := ptr + 1; ptr := StrScan(str,Delimiter); end; end;end;
 
先谢谢。procedure TForm1.Button1Click(Sender: TObject);var sl:Tstringlist; s:string;begin s:='"你,","我 1"'; sl:=TStringList.Create; try sl.CommaText:=s; memo1.Lines.Add(sl[1]);//返回 我 1 finally sl.free; end; memo1.Lines.Add(xx(s,',','"',1)); //返回 " 似乎没有考虑项目中本身包含 分隔符end;从函数代码看,QuoteChar: Char 这个参数没有用到。
 
自己修改一下吧.
 
procedure SetDelimitedText(const Value: string; QuoteChar, Delimiter: Char; sl: TStrings);var P, P1: PChar; S: string;begin P := PChar(Value); while P^ in [#1..' '] do Inc(P); while P^ <> #0 do begin if P^ = QuoteChar then S := AnsiExtractQuotedStr(P, QuoteChar) else begin P1 := P; while (P^ > ' ') and (P^ <> Delimiter) do Inc(P); SetString(S, P1, P - P1); end; sl.Add(S); while P^ in [#1..' '] do Inc(P); if P^ = Delimiter then begin P1 := P; Inc(P1); if P1^ = #0 then sl.Add(''); repeat Inc(P); until not (P^ in [#1..' ']); end; end;end; s := '"第一个 项目","第二个,项目","第三""个"'; SetDelimitedText(s, '"', ',', Memo1.Lines)
 
楼上的和直接用TStringList差异不大
 
本来就是这么回事,你要的不就是这个功能吗。我就纳闷了,好好的现成东西你不用,非要自己写个,给你写了一个你却认为和原有的一样了,你也没说不可以一样啊。请把你的问题描述清楚。
 
你一定要第I个,那再套一层函数吧function xx (S:String;Delimiter: Char;QuoteChar: Char;I:Integer):String;var sl: TStringList;begin sl := TStringList.Create; try SetDelimitedText(s, QuoteChar, Delimiter, sl); if sl.Count > i then Result := sl else Result := '' finally sl.Free; end;end;
 
多人接受答案了。
 

Similar threads

S
回复
0
查看
1K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
923
SUNSTONE的Delphi笔记
S
S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
后退
顶部