在Delphi TStringList中分割文本的更快捷方式
发布时间:2020-12-15 09:49:41 所属栏目:大数据 来源:网络整理
导读:我有一个需要在TStringList中进行大量文本操作的应用程序.基本上我需要用分隔符分割文本;例如,如果我有一个带有1000个字符的单行,并且此分隔符在此行中出现3次,那么我需要将其拆分为3行.分隔符可以包含多个char,例如,它可以是“[test]”之类的标记. 我用两种
我有一个需要在TStringList中进行大量文本操作的应用程序.基本上我需要用分隔符分割文本;例如,如果我有一个带有1000个字符的单行,并且此分隔符在此行中出现3次,那么我需要将其拆分为3行.分隔符可以包含多个char,例如,它可以是“[test]”之类的标记.
我用两种不同的方法编写了两个函数来完成这个任务,但是大量的文本都很慢(通常超过2个字节). 我怎样才能更快地实现这一目标? 这两个函数都接收2个参数:’lines’是原始的tstringlist,’q’是分隔符. function splitlines(lines : tstringlist; q: string) : integer; var s,aux,ant : string; i,j : integer; flag : boolean; m2 : tstringlist; begin try m2 := tstringlist.create; m2.BeginUpdate; result := 0; for i := 0 to lines.count-1 do begin s := lines[i]; for j := 1 to length(s) do begin flag := lowercase(copy(s,j,length(q))) = lowercase(q); if flag then begin inc(result); m2.add(aux); aux := s[j]; end else aux := aux + s[j]; end; m2.add(aux); aux := ''; end; m2.EndUpdate; lines.text := m2.text; finally m2.free; end; end; function splitLines2(lines : tstringlist; q: string) : integer; var aux,p : string; i : integer; flag : boolean; begin //maux1 and maux2 are already instanced in the parent class try maux2.text := lines.text; p := ''; i := 0; flag := false; maux1.BeginUpdate; maux2.BeginUpdate; while (pos(lowercase(q),lowercase(maux2.text)) > 0) and (i < 5000) do begin flag := true; aux := p+copy(maux2.text,1,pos(lowercase(q),lowercase(maux2.text))-1); maux1.add(aux); maux2.text := copy(maux2.text,lowercase(maux2.text)),length(maux2.text)); p := copy(maux2.text,1); maux2.text := copy(maux2.text,2,length(maux2.text)); inc(i); end; finally result := i; maux1.EndUpdate; maux2.EndUpdate; if flag then begin maux1.add(p+maux2.text); lines.text := maux1.text; end; end; end; 解决方法
我没有测试速度,但出于学术目的,这里有一个简单的方法来分割字符串:
myStringList.Text := StringReplace(myStringList.Text,myDelimiter,#13#10,[rfReplaceAll]); // Use [rfReplaceAll,rfIgnoreCase] if you want to ignore case 当您设置TStringList的Text属性时,它会解析新行并在那里拆分,因此转换为字符串,用新行替换分隔符,然后将其分配回Text属性. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |