gpt4 book ai didi

delphi - 在 Delphi TStringList 中分割文本的更快方法

转载 作者:行者123 更新时间:2023-12-03 15:03:47 25 4
gpt4 key购买 nike

我有一个应用程序需要在 TStringList 中进行大量文本操作。基本上我需要用分隔符分割文本;例如,如果我有一个包含 1000 个字符的单行,并且该分隔符在此行中出现 3 次,那么我需要将其分成 3 行。分隔符可以包含多个字符,例如可以是“[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,pos(lowercase(q),lowercase(maux2.text)),length(maux2.text));
p := copy(maux2.text,1,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

当您设置 TStringListText 属性时,它会解析新行并在那里拆分,因此转换为字符串,用新行替换分隔符,然后分配它返回到 Text 属性有效。

关于delphi - 在 Delphi TStringList 中分割文本的更快方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19567276/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com