Pregunta

Estoy analizando un archivo muy grande de registros (uno por línea, cada una de longitud variable), y me gustaría realizar un seguimiento de la cantidad de bytes que he leído en el archivo para que pueda recuperarme en caso de falla.

Escribí lo siguiente:

using (TextReader myTextReader = CreateTextReader())
{
    string record = myTextReader.ReadLine();
    bytesRead += record.Length;
    ParseRecord(record);
}

Sin embargo, esto no funciona desde ReadLine() tira cualquier caracteres CR/LF en la línea. Además, una línea puede ser terminado por caracteres CR, LF o CRLF, lo que significa que no puedo agregar 1 a bytesRead.

¿Hay una manera fácil de obtener la longitud de la línea real, o escribo la mía? ReadLine() método en términos de la granular Read() operaciones?

¿Fue útil?

Solución

Obtener la posición actual de la transmisión subyacente no ayudará, ya que el corrector de transmisión se le lee a los datos leídos de la transmisión.

Esencialmente, no puedes hacer esto sin escribir tu propio corredor de transmisión. ¿Pero realmente necesitas?

Simplemente contaría el número de líneas leídas.

Por supuesto, esto significa que para posicionarse en una línea específica necesitará leer N líneas en lugar de simplemente buscar una compensación, pero ¿qué tiene de malo eso? ¿Has determinado que el rendimiento será inaceptable?

Otros consejos

Un Textreader lee cadenas, que son caracteres, que [dependiendo de la codificación] no son iguales a los bytes.

¿Qué tal solo almacenar el número de líneas leídas y solo omita tantas líneas al recuperarse? Supongo que se trata de no procesar esa línea, no necesariamente evitar leerlas desde la transmisión.

Que lo piensen, puedo usar un StreamReader y obtenga la posición actual de la corriente subyacente de la siguiente manera.

using (StreamReader myTextReader = CreateStreamReader())
{
    stringRecord = myTextReader.ReadLine();
    bytesRead += myTextReader.BaseStream.Position;
    ParseRecord(record);
    // ...
}
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top