title: Faster way to split text in Delphi TStringList
body: <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>