Note that there are some explanatory texts on larger screens.

plurals
  1. POFaster way to split text in Delphi TStringList
    primarykey
    data
    text
    <p>I have an app that needs to do heavy text manipulation in a TStringList. Basically i need to split text by a delimiter ; for instance, if i have a singe line with 1000 chars and this delimiter occurs 3 times in this line, then i need to split it in 3 lines. The delimiter can contain more than one char, it can be a tag like '[test]' for example.</p> <p>I've wrote two functions to do this task with 2 different approaches, but both are slow in big amounts of text (more then 2mbytes usually).</p> <p>How can i achieve this goal in a faster way ? </p> <p>Here are both functions, both receive 2 paramaters : 'lines' which is the original tstringlist and 'q' which is the delimiter.</p> <pre><code>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)) &gt; 0) and (i &lt; 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; </code></pre>
    singulars
    1. This table or related slice is empty.
    plurals
    1. This table or related slice is empty.
    1. This table or related slice is empty.
 

Querying!

 
Guidance

SQuiL has stopped working due to an internal error.

If you are curious you may find further information in the browser console, which is accessible through the devtools (F12).

Reload