Tengo una función "Buscar archivos" en mi programa que encontrará archivos de texto con el sufijo .ged que mi programa lee. Puedo mostrar los resultados en una ventana de explorador-como el que se ve así:Cómo puedo leer de manera eficiente las primeras pocas líneas de muchos archivos en Delphi
que utilizan los métodos estándar FindFirst/FindNext, y esto funciona muy rápidamente. Los archivos 584 que se muestran arriba se encuentran y se muestran en un par de segundos.
Lo que ahora me gustaría hacer es agregar dos columnas a la pantalla que muestra el "Origen" y "Versión" que están contenidos en cada uno de estos archivos. Esta información se encuentra generalmente dentro de las 10 primeras líneas de cada archivo, en las líneas que se parecen:
1 SOUR FTM
2 VERS Family Tree Maker (20.0.0.368)
ahora no tengo problema al analizar esto muy rápidamente a mí mismo, y eso no es lo que estoy preguntando.
Lo que necesito ayuda es simplemente cómo cargar más rápidamente las primeras 10 líneas de estos archivos para poder analizarlos.
He intentado hacer un StringList.LoadFromFile, pero lleva mucho tiempo cargar los archivos de gran tamaño, por ejemplo, en los de más de 1 MB.
Ya que solo necesito las primeras 10 líneas más o menos, ¿cuál es la mejor forma de obtenerlas?
Estoy usando Delphi 2009, y mis archivos de entrada pueden ser o no ser Unicode, por lo que esto debe funcionar para cualquier codificación.
Seguimiento: Gracias Antonio,
que terminé haciendo esto que funciona muy bien:
var
CurFileStream: TStream;
Buffer: TBytes;
Value: string;
Encoding: TEncoding;
try
CurFileStream := TFileStream.Create(folder + FileName, fmOpenRead);
SetLength(Buffer, 256);
CurFileStream.Read(Buffer[0], 256);
TEncoding.GetBufferEncoding(Buffer, Encoding);
Value := Encoding.GetString(Buffer);
...
(parse through Value to get what I want)
...
finally
CurFileStream.Free;
end;
TStrings.LoadFromFile es muy ineficiente, olvídate de eso. Piense fuera de la caja y lea el número razonable de bytes (por ejemplo: NumLines * AvgLineLength), trunque con LineStart y luego divida en TStrings –
En realidad, Worm, no es tan malo como podría pensar. Puede leer y cargar aproximadamente 10 MB por segundo. Todavía lo uso con éxito cuando tengo que buscar textos en esos archivos. Pero por qué usarlo para cargar archivos completos y hacer que el usuario espere 40 segundos cuando solo necesita las primeras líneas que se necesitan. – lkessler