Comment connaître la position(linenumber) d'un streamreader dans un fichier texte?
un exemple (qui pourrait ne pas être la vraie vie, mais que mon point de vue) :
public void StreamInfo(StreamReader p)
{
string info = string.Format(
"The supplied streamreaer read : {0}\n at line {1}",
p.ReadLine(),
p.GetLinePosition()-1);
}
GetLinePosition
ici est une extension imaginaire de la méthode de streamreader.
Est-ce possible?
Bien sûr, je pourrais continuer à compter moi-même, mais ce n'est pas la question.
OriginalL'auteur Peter | 2009-05-06
Vous devez vous connecter pour publier un commentaire.
Il est extrêmement facile de fournir une ligne de comptage de wrapper pour tout TextReader:
Des inconvénients (par souci de concision):
Seek
.OriginalL'auteur Sinclair
Je cam sur ce post en cherchant une solution à un problème similaire où j'avais besoin de chercher le StreamReader pour une gamme particulière. J'ai fini par la création de deux méthodes d'extension pour obtenir et définir la position sur un StreamReader. Il ne fait pas de fournir un numéro de ligne, le comte, mais dans la pratique, je viens de prendre la position avant chaque ReadLine() et si la ligne est d'intérêt, puis-je garder la position de départ pour le réglage, plus tard, de revenir à la ligne comme ceci:
et la partie importante:
Cela fonctionne très bien pour moi et en fonction de votre tolérance pour l'utilisation de la réflexion, Il pense que c'est une solution plutôt simple.
Mises en garde:
System.Text.Encoding.UTF8
OriginalL'auteur Eamon
Non, pas vraiment possible. Le concept d'un "numéro de ligne" est basé sur les données réelles qui ont déjà été lu, et pas seulement de la position. Par exemple, si vous avez été à la méthode Seek() le lecteur à une position arbitraire, il n'est pas actuall va lire les données, de sorte qu'il ne serait pas en mesure de déterminer le numéro de la ligne.
La seule façon de le faire est de garder une trace de vous-même.
OriginalL'auteur Adam Robinson
Pas.
Considérer qu'il est possible de chercher à tout poisition en utilisant le flux sous-jacent de l'objet (qui peut être à tout point de la ligne).
Considérons maintenant ce qui ferait pour n'importe quel nombre conservés par le StreamReader.
Devrait le StreamReader aller et comprendre ce qui c'est maintenant?
Faut-il juste de garder un certain nombre de lignes de lecture, indépendamment de la position dans le fichier?
Il y a plus de questions que de ce qui serait un cauchemar à mettre en œuvre, à mon humble avis.
De l'autre côté, nous ne devons gagner rep pour répéter ce qui a déjà été dit? (Ne PAS dire cette affiche a fait, mais en général, il serais certainement possible!)
Dag: Pas tellement répéter, comme dit dans le même temps . . . JINX! (BTW, di tu veux acheter un dag?)
OriginalL'auteur Binary Worrier
C'est un type qui a mis en œuvre un StreamReader avec ReadLine() méthode qui enregistre la position dans le fichier.
http://www.daniweb.com/forums/thread35078.html
Je pense qu'on devrait hériter de StreamReader, puis ajouter le supplément de la méthode de la classe spéciale, ainsi que certaines propriétés (_lineLength + _bytesRead):
Pense qu'il y a un petit bug dans le code de la longueur de la chaîne est utilisée pour calculer la position dans le fichier au lieu d'utiliser les octets lus (Manque de soutien pour l'UTF8 et UTF16 fichiers encodés).
OriginalL'auteur Rolf Kristensen
Je suis venu ici à la recherche de quelque chose de simple. Si vous êtes juste en utilisant ReadLine() et ne se soucient pas de l'aide de la méthode Seek() ou quoi que ce soit, il suffit de faire une simple sous-classe StreamReader
et puis vous faites de la voie normale, dire à partir d'un objet FileInfo fichier nommé
et que vous venez de lire le
reader.LineNumber
propriété.ReadLine
est le méthode que vous appelez.C'est une solution qui ne demande qu'à cause de bugs en bas de la ligne. Quelqu'un qui sera plus tard l'utilisation de méthode de recherche ou de quoi que ce soit et il ne fonctionne plus (ou de passer à une méthode qui utilise une autre méthode que ReadLine). Si la classe est capable de seulement utiliser ReadLine correctement, il ne devrait pas hériter de StreamReader. Je suis assez sûr que cela viole le principe de substitution de Liskov.
OriginalL'auteur Andy Hubbard
Les points déjà pris à l'égard du BaseStream sont valables et importants. Cependant, il existe des situations dans lesquelles vous voulez lire un texte et de savoir où dans le texte que vous. Il peut toutefois être utile d'écrire que comme une classe pour le rendre facile à réutiliser.
J'ai essayé d'écrire une telle classe maintenant. Il semble fonctionner correctement, mais c'est plutôt lent. Il doit être beau quand la performance n'est pas indispensable (il n'est pas que lent, voir ci-dessous).
- Je utiliser la même logique à suivre la position dans le texte, peu importe si vous lisez un char à un moment, un tampon à un moment, ou une ligne à la fois. Alors que je suis sûr que cela peut être fait pour effectuer plutôt mieux par l'abandon de cela, il l'a rendue beaucoup plus facile à mettre en œuvre... et, je l'espère, à se conformer au code.
J'ai fait un très de base de comparaison des performances de la méthode ReadLine (qui je crois est le point faible de cette mise en œuvre) à StreamReader, et la différence est presque un ordre de grandeur. J'ai 22 MB/s à l'aide de ma classe StreamReaderEx, mais près de 9 fois à l'aide de StreamReader directement (sur mon SSD équipés d'ordinateur portable). Alors qu'il pourrait être intéressant, je ne sais pas comment faire pour faire un bon test de lecture; peut-être à l'aide de 2 fichiers identiques, chacun plus grand que le disque de la mémoire tampon, et de la lecture en alternance..? Au moins mon test simple produit des résultats cohérents quand je le lance plusieurs fois, et indépendamment de la classe lit le fichier de test en premier.
Le symbole de Saut de ligne par défaut de l'Environnement.De retour à la ligne, mais peut être réglé à n'importe quelle chaîne de longueur 1 ou 2. Le lecteur ne considère que ce symbole comme un retour à la ligne, qui peut être un inconvénient. Au moins je sais que Visual Studio m'a incité un bon nombre de fois qu'un fichier que j'ai ouvert "n'est pas cohérente des retours à la ligne".
Veuillez noter que je n'ai pas inclus la Garde de la classe; c'est un simple utilitaire de la classe et il doit être obvoius à partir du contexte, comment la remplacer. Vous pouvez même le supprimer, mais vous perdez un argument de vérifier, et ainsi le code résultant serait plus loin de la "corriger". Par exemple, la Garde.NotNull(s, "s") vérifie simplement que la s n'est pas null, jetant un ArgumentNullException (avec l'argument le nom de "s", d'où le deuxième paramètre) devrait-il être le cas.
Assez de bavardage, voici le code:
OriginalL'auteur The Dag