Question

Je suis l'analyse d'un fichier très grand nombre d'enregistrements (une par ligne, chacune de longueur variable), et je voudrais garder une trace du nombre d'octets que je l'ai lu dans le dossier afin que je puisse récupérer dans le cas d'échec.

J'écrit ce qui suit:

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

Toutefois, cela ne fonctionne pas depuis bandes ReadLine() tous les caractères CR / LF dans la ligne. En outre, une ligne peut être résilié par CR, LF, ou caractères CRLF, qui signifie que je ne peux pas ajouter 1 à bytesRead.

Y at-il un moyen facile d'obtenir la longueur de la ligne réelle, ou dois-je écrire ma propre méthode de ReadLine() en termes des opérations de Read() granulaire?

Était-ce utile?

La solution

Obtenir la position actuelle du flux sous-jacent ne sera pas utile, puisque le StreamReader sera tampon de données lues à partir du flux.

Essentiellement vous ne pouvez pas faire cela sans écrire votre propre StreamReader. Mais avez-vous vraiment besoin?

je voudrais simplement compter le nombre de lignes lues.

Bien sûr, cela signifie que la position à une ligne spécifique dont vous aurez besoin de lire les lignes N plutôt que de chercher simplement à un décalage, mais ce qui est mal à cela? Avez-vous déterminé que la performance sera inacceptable?

Autres conseils

Un TextReader lit des chaînes, qui sont des caractères qui [selon l'encodage] ne correspond pas à octets.

Que diriez-vous simplement stocker nombre de lignes lues, et juste sauter que de nombreuses lignes lors de la récupération? Je suppose que tout cela est de ne pas traiter les lignes, pas nécessairement éviter de les lire à partir du flux.

Quand j'y pense, je peux utiliser un StreamReader et obtenir la position actuelle du flux sous-jacent comme suit.

using (StreamReader myTextReader = CreateStreamReader())
{
    stringRecord = myTextReader.ReadLine();
    bytesRead += myTextReader.BaseStream.Position;
    ParseRecord(record);
    // ...
}
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top