Lecture de fichiers texte, ligne par ligne, avec le décalage exact/déclaration de la position

Mon simple exigence: la Lecture d'un énorme (> un million) en ligne fichier de test (Pour cet exemple, supposons qu'elle est un CSV de quelques sortes), et en gardant une référence au début de la ligne, pour accélérer la recherche dans l'avenir (lire une ligne, en commençant par X).

J'ai essayé de la naïve et facile d'abord, à l'aide d'un StreamWriter et accès à la sous-jacentes BaseStream.Position. Malheureusement, cela ne fonctionne pas comme je l'ai prévu:

Donné un dossier contenant les éléments suivants

Foo
Bar
Baz
Bla
Fasel

et ce code très 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 sortie est:

000 Foo
025 Bar
025 Baz
025 Bla
025 Fasel

Je peux imaginer que le flux est d'essayer d'être utile/efficace et peut-lit (gros) morceaux chaque fois que de nouvelles données sont nécessaires. Pour moi, c'est mauvais..

La question, enfin: une façon d'obtenir l' (byte, char) de décalage lors de la lecture d'un fichier ligne par ligne, sans l'aide d'une base de Flux et de jouer avec \r \n \r\n et de codage de la chaîne etc. manuellement? Pas une grosse affaire, vraiment, je n'aime pas à construire des choses qui existent peut-être déjà..

Si vous refléter le Système.IO.Flux de classe, le tampon minimale autorisée est de 128 octets... vous ne savez pas si cela va aider, mais sur une plus fichier quand j'ai essayé ceci, qui a été la plus courte de la position que je pouvais obtenir.

OriginalL'auteur Benjamin Podszun | 2010-04-07