2010-02-10 19 views
5

Duplicar posibles:
How to read a text file reversely with iterator in C#.net: ¿Hay alguna manera de leer un archivo txt de abajo hacia arriba?

Me pregunto si hay una manera de leer un archivo de texto de abajo hacia arriba sin ninguna penalización en el rendimiento, la readLine, enfoque MoveNext, pero a la inversa , ¿es posible este tipo de cosas en .net?

Para hacer más interesante el archivo de texto tiene alrededor de 100 000 líneas en él, por lo que no se puede engañar con una ReadAll, invertir ...

algo más de detalle: Tengo una colección de valores de cadena entrantes que está prefijado con una ID int que se puede ordenar. Lamentablemente, recibo estos ID en el orden incorrecto. El problema principal es el volumen total de los valores de cadena y ningún RDBMS en la solución. Entonces realmente necesito una forma de almacenar los valores de cadena y luego invertir el orden del almacenamiento durante el procesamiento. Me vino a la mente el archivo de texto porque no tengo una mejor solución en este momento.

Gracias de antemano.

+0

Debe haber algún tipo de método de "vistazo" bajo. –

+3

¿No te refieres de abajo hacia arriba? –

+1

Sí, de arriba a abajo es una especie de forma estándar ... –

Respuesta

-1

El método ReadBlock de la clase StreamReader le permite leer desde una posición específica. No estoy seguro del rendimiento, es posible que desee leerlo en una matriz y luego invertirlo.

+0

Lo haría, excepto que estoy más allá del punto de cargarlo todo en una colección debido a limitaciones de memoria y grandes volúmenes, desafortunadamente. –

+0

ReadBlock le permite leer * en * una posición específica en la matriz en la que está escribiendo. No le permite especificar el índice para leer * desde * dentro del lector. –

0

Bueno, si usted está dispuesto a sumergirse profundamente que, presumiblemente, podría utilizar un lector binario y hacer su propia lectura ...

Habría que averiguar los finales de línea a la inversa, y encontrar la manera para asegurarse de tener la codificación correcta.

Bastante desalentador, diría yo.

+0

Tienes razón, es un dolor. Aunque bastante interesante :) –

0

Una respuesta general. Si hay algún tipo de método peek(), probablemente podría establecer su puntero de archivo en filesize (o filesize - 1?) Y luego disminuir el puntero hasta llegar a 0. Puede haber alguna clase en .NET que abstraiga esto. Por supuesto, debe definir algún tipo de tamaño de búfer (básicamente, defina el tamaño de los "fragmentos" del archivo que está leyendo). En ese caso, el filesize - 1 anterior podría convertirse en filesize - bufferSize, e incrementaría también su puntero de archivo en bufferSize.

0

Creo que puede hacer esto puede usar el PInvoke para hacer esto a través de WINAPI. Necesita crear un archivo asignado a la memoria, pero solo debe mapear el final del archivo y luego subirlo.

0

Así que obtienes los valores en el orden incorrecto pero quieres recuperarlos en el orden correcto. Tal vez un

Stack<T> 

Sería bueno para usted.

http://msdn.microsoft.com/en-us/library/3278tedw.aspx

representa un tamaño variable de último en entrar, primero en salir de recogida (LIFO) de instancias del mismo tipo arbitrario.

+0

Gracias, eso es un gran conocimiento, pero desafortunadamente originalmente llené mi lista usando una serie de llamadas por lotes, de lo contrario funcionaría muy bien. –

1

¿Por qué no utilizar el método ReadToEnd() de una clase StreamReader, luego trabajar hacia atrás ... Es cierto que no es bonito pero funciona, utilicé una matriz de bytes para crear una instancia MemoryStream y el uso que para la instancia StreamReader, usando el puntero hocus-pocus, los datos se leen de forma retrógrada.

 
unsafe 
{ 
    byte[] b = System.Text.ASCIIEncoding.ASCII.GetBytes("Hello World! Foo wuz ere and so wuz bar"); 
    using (MemoryStream mStream = new MemoryStream(b)) 
    { 
     string readStr; 
     using (StreamReader sr = new StreamReader(mStream)) 
     { 
      readStr = sr.ReadToEnd(); 
     } 
     Console.WriteLine(readStr); 
     fixed (char* beg = readStr) 
     { 
      char* p = beg + readStr.Length; 
      while (p-- != beg) 
      { 
       Console.Write(*p); 
      } 
     } 
    } 
} 

Espero que esto ayude, Saludos cordiales, Tom .

+0

¡dang! acabo de publicar esto antes de que se cerrara cuando estaba probando el código ... suspiro – t0mm13b

Cuestiones relacionadas