Muy buena la opción de
Neftali (no me acordé de ella) a la que se le podría sumar
ExtractStrings de la unit
Classes.
Para salir de dudas sobre la eficiencia de usar una u otra alternativa, hice una prueba sobre un archivo de texto de 22350 líneas con este código:
Código Delphi
[-]
...
uses StrUtils;
var
frec, ini, fin: Int64;
procedure TForm1.FormCreate(Sender: TObject);
begin
Memo1.Lines.LoadFromFile('C:\PRUEBA.TXT');
Caption:= Format('Nro lineas: %d', [Memo1.Lines.Count[);
QueryPerformanceFrequency(frec);
end;
function Concat1(Lineas: TStrings): string;
var
i: Integer;
begin
Result := '';
Lineas.BeginUpdate;
try
for i := 0 to Lineas.Count - 1 do
Result := Result + Trim(Lineas[i]) + ' ';
SetLength(Result, Length(Result)-1);
finally
Lineas.EndUpdate;
end;
end;
function Concat2(Lineas: TStrings): string;
begin
Result:= AnsiReplaceText(Lineas.Text, sLineBreak, ' ');
end;
procedure TForm1.btnForClick(Sender: TObject);
begin
Memo2.Clear;
QueryPerformanceCounter(ini);
Memo2.Text:= Concat1(Memo1.Lines);
QueryPerformanceCounter(fin);
Label1.Caption:= FormatFloat('0, µs.', (fin - ini) * 1000000 div frec);
end;
procedure TForm1.btnExtClick(Sender: TObject);
begin
Memo2.Clear;
QueryPerformanceCounter(ini);
Memo2.Text:= Concat2(Memo1.Lines);
QueryPerformanceCounter(fin);
Label2.Caption:= FormatFloat('0, µs.', (fin - ini) * 1000000 div frec);
end;
(Mientras escribía la prueba recordé agreguar
EnableControls y
DisiableControls para mejorar la performance.)
El resultado promedio de 3 mediciones:
- Procedimiento Concat1: 1.411.396 ms
- Procedimiento Concat2: 7.415.044 ms
La balanza se inclina a recorrer el
TStrings con un
for y creo que es debido a que
AnsiReplaceText debe realizar comprobaciones adicionales para lograr su gran ductilidad de uso.
Saludos