Tôi có một ứng dụng cần thao tác văn bản nặng trong TStringList. Về cơ bản tôi cần phải tách văn bản bằng dấu phân cách; Ví dụ, nếu tôi có một dòng singe với 1000 ký tự và dấu phân cách này xảy ra 3 lần trong dòng này, sau đó tôi cần phải chia nó trong 3 dòng. Dấu phân cách có thể chứa nhiều hơn một char, nó có thể là một thẻ như '[test]' chẳng hạn.Cách nhanh hơn để tách văn bản trong Delphi TStringList
Tôi đã viết hai chức năng để thực hiện tác vụ này với 2 cách tiếp cận khác nhau, nhưng cả hai đều chậm với số lượng lớn văn bản (nhiều hơn 2 triệu byte thường).
Làm cách nào để đạt được mục tiêu này một cách nhanh hơn?
Dưới đây là cả hai chức năng, cả hai nhận được 2 paramaters: 'lines' là tstringlist gốc và 'q' là dấu tách.
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;
Vấn đề là dấu phân cách của tôi có nhiều hơn một char, ví dụ: đó có thể là toàn bộ từ. – delphirules
Bao gồm tất cả các yêu cầu được đề cập. Btw, đặt thử sau khi gọi hàm tạo. –
Bạn có thể tìm thấy câu trả lời cho câu hỏi này có thể sử dụng được: http://stackoverflow.com/questions/15424293/how-to-split-string-by-a-multi-character-delimiter/15427587#15427587 –