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

Karibot Messages postés 89 Date d'inscription mardi 19 janvier 2010 Statut Membre Dernière intervention 21 juin 2016 - 19 juil. 2010 à 16:05
Karibot Messages postés 89 Date d'inscription mardi 19 janvier 2010 Statut Membre Dernière intervention 21 juin 2016 - 24 juil. 2010 à 19:06
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.

4 réponses

MasterShadows Messages postés 268 Date d'inscription lundi 1 mars 2004 Statut Membre Dernière intervention 19 avril 2012 12
24 juil. 2010 à 18:59
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...
2
cs_coq Messages postés 6349 Date d'inscription samedi 1 juin 2002 Statut Membre Dernière intervention 2 août 2014 101
19 juil. 2010 à 17:18
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
*/
0
Karibot Messages postés 89 Date d'inscription mardi 19 janvier 2010 Statut Membre Dernière intervention 21 juin 2016 2
19 juil. 2010 à 17:26
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?
0
Karibot Messages postés 89 Date d'inscription mardi 19 janvier 2010 Statut Membre Dernière intervention 21 juin 2016 2
24 juil. 2010 à 19:06
Merci beaucoup MasterShadow,
je vais tester :)
0
Rejoignez-nous