Escenario: archivo de texto de 150 MB que es la bandeja de entrada exportada de una cuenta de correo electrónico anterior. Es necesario analizar y extraer correos electrónicos de un usuario específico y los escribe en un archivo nuevo y único. Tengo un código que funciona, es obstinado lento.Optimizar archivo C# IO
Estoy usando cadenas de marcador para buscar dónde comenzar/finalizar la copia desde el archivo original.
Aquí es la función principal:
StreamReader sr = new StreamReader("c:\\Thunderbird_Inbox.txt");
string working = string.Empty;
string mystring = string.Empty;
while (!sr.EndOfStream)
{
while ((mystring = sr.ReadLine()) != null)
{
if (mystring == strBeginMarker)
{
writeLog(mystring);
//read the next line
working = sr.ReadLine();
while(!(working.StartsWith(strEndMarker)))
{
writeLog(working);
working = sr.ReadLine();
}
}
}
}
this.Text = "DONE!!";
sr.Close();
La función que escribe los mensajes seleccionados en el nuevo archivo:
public void writeLog(string sMessage)
{
fw = new System.IO.StreamWriter(path, true);
fw.WriteLine(sMessage);
fw.Flush();
fw.Close();
}
Una vez más, este proceso funciona. Obtengo un buen archivo de salida, solo lleva mucho tiempo y estoy seguro de que hay formas de hacerlo más rápido.
BTW: es posible que desee considerar la instrucción using en lugar de Close() manualmente; es más seguro en caso de que acierte una excepción. Mi ejemplo demuestra ... –
'while (! SndEfStream)' es redundante con 'while ((mystring = sr.ReadLine())! = Null)' –