[C#]: Compter le nombre de ligne d'un fichier et la position du streamReader

Signaler
Messages postés
89
Date d'inscription
mardi 19 janvier 2010
Statut
Membre
Dernière intervention
21 juin 2016
-
Messages postés
89
Date d'inscription
mardi 19 janvier 2010
Statut
Membre
Dernière intervention
21 juin 2016
-
Bonjour,
je souhaitrai lire un fichier grace à streamreader et connaitre le nombre de lignes contenues dans le fichier ainsi que le numéro de la ligne qu'il est en train de lire.
le but est de créer une pseudo barre de progression de mon traitement!
j'ai essayé avec basestream.length et .position mais cela n'a pas l'air de marcher: length me renvoie la longueur en byte et pas le nombre de lignes et .position me renvoie '0' tout le temps.

Avez vous une idée?
merci.
A voir également:

4 réponses

Messages postés
268
Date d'inscription
lundi 1 mars 2004
Statut
Membre
Dernière intervention
19 avril 2012
10
Salut, pour ta barre de progression, tu n'as pas besoin de connaitre ton nombre de lignes. Ton nombre de caractère suffit.

Imaginons que ton fichier à une taille de 8192 octets. (Donc .Length de streamreader vaut 8192)

Imaginons que tu lise ton fichier avec un buffer de 64 octets.
A chaque fois que le buffer est remplit, il est rempli de 64 octets.

Donc pour ta barre de progression, une base comme cela devrait marcher :

public class WorkingBar
{
    private ProgressBar bar;

    public WorkingBar(ref ProgressBar bar)
    {
       this.bar = bar;
       this.bar.Minimum = 0;
       this.bar.Maximum = 100;
    }

    public void Perform(float value, float total)
    {
        bar.Value = value / total * 100f;
    }
}

Ensuite avec le StreamReader :

private WorkingBar bar;
private char[] buffer;
private StringBuilder result;

public FileReader(ref ProgressBar bar, int bufferSize)
{
   bar = new WorkingBar(ref bar);
   buffer = new char[bufferSize];
   result = new StringBuilder();
}

public void Read(string file)
{
    using(StreamReader reader = new StreamReader(file))
    {
        int currentIndex = 0;
        // Tant que l'on est pas à la fin du fichier
        while(!reader.EndOfStream)
        {
            // Remplit le buffer
            reader.Read(buffer, currentIndex, buffer.Length);
            result.Append(buffer);
            currentIndex += buffer.Length;

            // Nouvelle valeur de progression
            bar.Perform((float)currentIndex, (float)reader.BaseStream.Length);
            Application.DoEvents();

            // Pause le thread histoire de faire croire que l'on lit un très gros fichier
            Thread.Sleep(100);
        }
        reader.Close();
    }
}


Voili voilou, tu devrais pouvoir t'en sortir avec ça...
Messages postés
6351
Date d'inscription
samedi 1 juin 2002
Statut
Modérateur
Dernière intervention
2 août 2014
84
Bonjour,

Si le fichier n'est pas constitué de lignes à taille fixe (en octets, pas en nombre de caractères) ce n'est pas possible sans parcourir le fichier.
BaseStream.Position sera quant à elle mise à jour au fur et à mesure que le fichier est lu, et sera si mes souvenir sont bons dépendante de la taille du buffer utilisé pour la lecture du fichier.


/*
coq
MVP Visual C#
CoqBlog
*/
Messages postés
89
Date d'inscription
mardi 19 janvier 2010
Statut
Membre
Dernière intervention
21 juin 2016
2
Merci le Coq :)
question:
comment je peux faire pour savoir si mes lignes sont identiques en octets? parce qu'on nombre de caractères, elles ne le sont pas...

sinon, comment puis-je m'y prendre pour faire une barre de progression si je ne peux pas calculer le nombre de ligne qu'il traite? si je transforme mon streamreader en list<>, je pourrais faire un list.count pour connaitre le nombre de ligne mais je crais que sur de gros fichiers cela ralentisse le traitement...
une idée?
Messages postés
89
Date d'inscription
mardi 19 janvier 2010
Statut
Membre
Dernière intervention
21 juin 2016
2
Merci beaucoup MasterShadow,
je vais tester :)