Mi requisito simple: leer un enorme archivo de prueba de línea (> un millón) (en este ejemplo supongo que es un CSV de algún tipo) y mantener una referencia al principio de esa línea para una búsqueda más rápida en el futuro (lea una línea, comenzando en X).Lectura de archivos de texto línea por línea, con informe de desplazamiento/posición exacta
me trataron de la manera ingenua y sencilla en primer lugar, el uso de un StreamWriter
y acceder a la subyacente BaseStream.Position
. Por desgracia eso no funciona como era mi intención:
dado un archivo que contiene la siguiente
Foo
Bar
Baz
Bla
Fasel
y este código muy simple
using (var sr = new StreamReader(@"C:\Temp\LineTest.txt")) {
string line;
long pos = sr.BaseStream.Position;
while ((line = sr.ReadLine()) != null) {
Console.Write("{0:d3} ", pos);
Console.WriteLine(line);
pos = sr.BaseStream.Position;
}
}
la salida es:
000 Foo
025 Bar
025 Baz
025 Bla
025 Fasel
Me imagino que la transmisión intenta ser útil/eficiente y, probablemente, se lee en partes (grandes) cuando n nuevos datos son necesarios. Para mí esto es malo ...
La pregunta, finalmente: Cualquier forma de obtener el byte, char) compensar mientras lee un archivo línea por línea sin usar un flujo básico y jugando con \ r \ n \ r \ n y la codificación de cadena, etc. manualmente? No es gran cosa, realmente, simplemente no me gusta construir cosas que pudieran existir ya ..
Si usted refleja a cabo la clase System.IO.Stream, el búfer mínima permitida es de 128 bytes ... no estoy seguro si esto ayuda, pero en un archivo más largo cuando probé esto, esa era la posición más corta que podía obtener. –