IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Entrée/Sortie Java Discussion :

pourcentage d'un fichier lu


Sujet :

Entrée/Sortie Java

  1. #1
    Nouveau membre du Club
    Homme Profil pro
    Développeur Web
    Inscrit en
    Février 2013
    Messages
    55
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Février 2013
    Messages : 55
    Points : 28
    Points
    28
    Par défaut pourcentage d'un fichier lu
    Salut je souhaiterai afficher dans mon application, le pourcentage d'un fichier lu j'ai essayer ca :

    pourcentage <- ligneLu.length() / fichier.length() * 100

    problème ça ne fonctionne pas pour certain gros fichier au bout d'un moment les lignes lu font plus que le totale.

  2. #2
    Modérateur

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    12 551
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 551
    Points : 21 607
    Points
    21 607
    Par défaut
    Normal puisque toutes les lignes ne font pas la même taille et que la taille du fichier n'indique pas le nombre de lignes, mais le nombres d'octets.

    Il ne faut donc pas compter les lignes, il faut compter les octets. Malheureusement, pour compter les octets tout en lisant des lignes, il faut le faire, soit de manière très lente (lire caractère par caractère jusqu'à tomber sur une fin de ligne, en buffurisant peu,) soit de manière imprécise (considérer qu'on en est, non pas à la position de la dernière ligne, mais à la position du dernier octet gardé dans le buffer. Ce qui peut être faux si, par exemple, chaque ligne prend 5 minutes à traiter, et que les 5 dernières lignes sont toutes dans le buffer, le fichier étant considéré à 100%, et pourtant il reste 25 minutes de traitement.)
    Et c'est assez compliqué à faire, aussi.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  3. #3
    Nouveau membre du Club
    Homme Profil pro
    Développeur Web
    Inscrit en
    Février 2013
    Messages
    55
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Février 2013
    Messages : 55
    Points : 28
    Points
    28
    Par défaut
    merci de ta réponse néanmoins existe-il une solution fiable ?

  4. #4
    Modérateur

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    12 551
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 551
    Points : 21 607
    Points
    21 607
    Par défaut
    Oui, mais je n'en ai pas trouvé sur Internet. Je les ai programmées moi-même.
    Cela dit, si tu connais les encodages possibles des fichiers à lire, et qu'ils sont tous rétrocompatibles ASCII, c'est assez simple : il suffit d'utiliser directement FileInputStream et de compter les octets lus. Pour lire une ligne, tu lis simplement des octets jusqu'à trouver une fin de ligne, et tu gardes les suivants de côté pour la prochaine lecture.

    Edit : ok, je retire ce que j'ai dit, même comme ça ça reste assez difficile.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  5. #5
    Membre régulier
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2013
    Messages
    124
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Finance

    Informations forums :
    Inscription : Février 2013
    Messages : 124
    Points : 81
    Points
    81
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    BufferedReader br=new BufferedReader(new FileReader(url))
    int compteur=0;
    while((ligne=br.readligne)!=null){
    compteur++;
    }
    br.close()
    br=new BufferedReader(new FileReader(url))
    int j=0;
    while ((ligne=br.readligne)!=null){
    j++;
    System.out.println("pourcentage : "+j/i+"%");
    }
    Pour la méthode octet je ne sais pas, mais c'est sans doute la meilleur.

  6. #6
    Modérateur

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    12 551
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 551
    Points : 21 607
    Points
    21 607
    Par défaut
    Oui enfin, lire le fichier deux fois juste pour pouvoir afficher une barre de progression la deuxième fois... Bon, il y a des cas où ça se justifie, mais c'est pas en général -_-°.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  7. #7
    Nouveau membre du Club
    Homme Profil pro
    Développeur Web
    Inscrit en
    Février 2013
    Messages
    55
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Février 2013
    Messages : 55
    Points : 28
    Points
    28
    Par défaut
    oui effectivement la on est sur mais comme le dit thelvin tu lit le fichier deux fois et si il y a trop de lignes bonjour le temps perdu sinon j'ai toujours pas trouvée qq chose de fiable en dehors de ca

  8. #8
    Modérateur

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    12 551
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 551
    Points : 21 607
    Points
    21 607
    Par défaut
    J'ai regardé un peu ce que font les autres, et je crois bien qu'ils utilisent la méthode imprécise : celle qui compte le nombre d'octets qui ont été lus et buffurisés, mais pas qui ont été traités (et qui donc risque d'estimer que 100% a été fait, alors qu'il reste genre 5 lignes dans le buffer qui n'ont pas encore été traitées.)
    En effet ils restent coincés aussi longtemps à 100% qu'aux autres pourcentages, or en principe, à 100%, on a fini et la suite est immédiate. Je suppose que c'est acceptable dans le monde réel.

    Guava propose CountingInputStream qui peut te dire à tout moment combien d'octets tu as lus dans le fichier.

    Ça ressemble à ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    long fileSize = file.length();
     
    try(
      CountingInputStream stream = new CountingInputStream(new FileInputStream(file));
      BufferedReader reader = new BufferedReader(new InputStreamReader(stream, "utf-8"))
    ) {
     
      for(String line = reader.readLine(); line != null; line = reader.readLine()) {
        // traiter la ligne
        System.out.format("pourcentage : %f%%\n", 100.0*stream.getCount()/fileSize);
      }
     
    }
    Bien sûr c'est en supposant qu'il est vraiment impossible de savoir combien il y a de lignes dès le début.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  9. #9
    Expert éminent sénior
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Points : 23 190
    Points
    23 190
    Billets dans le blog
    1
    Par défaut
    Salut,

    Citation Envoyé par thelvin Voir le message
    Bien sûr c'est en supposant qu'il est vraiment impossible de savoir combien il y a de lignes dès le début.
    Je ne vois pas comment cela pourrait être possible sans lire le fichier deux fois...


    Sinon pour éviter d'obtenir le 100% trop tôt on peut utiliser un Math.min() pour gruger et ne pas dépasser les 99% pendant le traitement :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
      for(String line = reader.readLine(); line != null; line = reader.readLine()) {
        // traiter la ligne
        System.out.format("pourcentage : %f%%\n", Math.min(99.0, 100.0*stream.getCount()/fileSize));
      }
      System.out.format("pourcentage : 100%%\n");



    Sinon une autre astuce que j'ai déjà vu, et que je trouve vraiment maligne, c'est de ne pas s'embêter avec tout cela et d'utiliser une fausse barre de progression basé sur le temps de traitement moyen...
    Ou encore plus simple utiliser un ajaxloader.gif


    a++

  10. #10
    Modérateur

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    12 551
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 551
    Points : 21 607
    Points
    21 607
    Par défaut
    Citation Envoyé par adiGuba Voir le message
    Je ne vois pas comment cela pourrait être possible sans lire le fichier deux fois...
    Pourtant il y a plein d'autres techniques communes :
    - charger d'abord toutes les lignes en mémoire, et les traiter ensuite (défaut : on peut pas charger un fichier trop gros)
    - la première ligne est un nombre qui indique combien il y a de lignes ensuite (défaut : il faut concevoir le fichier comme ça dès le début, et c'est une information redondante avec le vrai nombre de lignes. Il est possible de construire un fichier pour indiquer un mauvais nombre de lignes.)
    - le système qui fournit le fichier a retenu le nombre de lignes dans ce fichier, et communique cette information en plus du fichier lui-même. Ça peut être considéré comme un cache des métadonnées qui ont déjà été calculées. (Défaut : comme au-dessus.)
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  11. #11
    Expert éminent sénior
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Points : 23 190
    Points
    23 190
    Billets dans le blog
    1
    Par défaut
    Oui... mais dans le premier car tu traites deux fois le fichier quand même (et cela peut être gourmand en mémoire selon le fichier).
    Pour le reste ca reste des traitements particuliers basés sur le traitement des fichiers...

    Je parlais plutôt d'un point de vue plus global...


    a++

  12. #12
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    La question fondamentale c'est: est-ce que tu as un besoin particulier qui nécessite de s'emmerder à faire un barre précise plutot qu'une barre approximative?

    Si c'est pour une progressbar, non seulement l'utilisateur ne verra pas l'approximation, mais en plus même si t'es précis, l'utilisateur aura l'impression que ça foire parce que ce que veux l'utilisateur, c'est pas une progression en terme de travail accompli / restant, mais en termes de temps passé / temps restant

  13. #13
    Membre régulier
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2013
    Messages
    124
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Finance

    Informations forums :
    Inscription : Février 2013
    Messages : 124
    Points : 81
    Points
    81
    Par défaut
    @tchize_ : Ta vision semble être la même que celle de Windows, envoie ton CV !!

  14. #14
    Modérateur

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    12 551
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 551
    Points : 21 607
    Points
    21 607
    Par défaut
    En même temps, après réflexion, je crois bien qu'il y a vraiment que mes partenaires commerciaux pour tenir à ce que, quand j'annonce un pourcentage de la tâche traitée, cela correspond exactement au nombre d'actions qu'ils constatent traitées à ce moment-là divisé par le nombre d'actions qu'ils savent qu'il y a à traiter dans le fichier.
    En plus j'avais pensé à l'époque, pour leur faire plaisir, à remplacer "pourcentage effectué" par "lecture du fichier de travail... X% lus" (sous-entendu j'ai dit que le fichier a été lu à telle hauteur, pas quel pourcentage des actions ont été faites. De toute façon la lecture ne se continue qu'au fur et à mesure que les actions sont faites, donc la différence est minime, mais il y en a une non-mesurable.) Mais du coup ils voulaient pas que je reformule ma formulation malheureuse, ils voulaient que je leur fasse le calcul précis.

    Ça les arrange bien pour faire des tests et vérifier qu'on les enfume pas je comprends, mais des nouveaux coûts de développement pour ça, ça me semble pas vraiment malin sur le fond.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  15. #15
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    @dumbl tu pourrais élaborer ta relfexion? J'ai du mal à comprendre son sens....

  16. #16
    Expert éminent sénior
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Points : 23 190
    Points
    23 190
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par thelvin Voir le message
    Ça les arrange bien pour faire des tests et vérifier qu'on les enfume pas je comprends, mais des nouveaux coûts de développement pour ça, ça me semble pas vraiment malin sur le fond.
    +1

    Parfois le calcul du pourcentage est plus complexe à réaliser que le traitement lui même...


    a++

  17. #17
    Membre régulier
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2013
    Messages
    124
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Finance

    Informations forums :
    Inscription : Février 2013
    Messages : 124
    Points : 81
    Points
    81
    Par défaut
    @tchize_ : Sur window on se retrouve souvent à 100% et elle reste planter pendant longtemps.

  18. #18
    Modérateur

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    12 551
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 551
    Points : 21 607
    Points
    21 607
    Par défaut
    Ailleurs aussi... Parce qu'en général le temps des finitions n'est pas compté.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  19. #19
    Modérateur
    Avatar de wax78
    Homme Profil pro
    Chef programmeur
    Inscrit en
    Août 2006
    Messages
    4 074
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : Belgique

    Informations professionnelles :
    Activité : Chef programmeur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2006
    Messages : 4 074
    Points : 7 978
    Points
    7 978
    Par défaut
    Citation Envoyé par thelvin Voir le message
    Guava propose CountingInputStream qui peut te dire à tout moment combien d'octets tu as lus dans le fichier.
    [/CODE]
    Pourquoi utiliser ces libs et pourquoi ne pas simplement additionner le nbr de bytes contenue dans chaque ligne lue ?
    (Les "ça ne marche pas", même écrits sans faute(s), vous porteront discrédit ad vitam æternam et malheur pendant 7 ans)

    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  20. #20
    Modérateur

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    12 551
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 551
    Points : 21 607
    Points
    21 607
    Par défaut
    Pas faux. J'ai la manie de la précision absolue, et on ne peut pas savoir exactement combien il y avait d'octets dans une ligne. Mais c'est vrai que c'est pas pour la différence que ça fait...
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

Discussions similaires

  1. [Débutant] Calculer le pourcentage d'un traitement de fichier csv
    Par slim025 dans le forum C#
    Réponses: 3
    Dernier message: 20/05/2015, 18h33
  2. Réponses: 1
    Dernier message: 13/03/2015, 14h58
  3. Pourcentage copy d'un fichier de 20GB [VB.Net]
    Par pISQUIK dans le forum VB.NET
    Réponses: 19
    Dernier message: 07/11/2011, 11h54
  4. fichier mappé en mémoire
    Par WinBernardo dans le forum Delphi
    Réponses: 7
    Dernier message: 01/12/2006, 09h38
  5. [Algorithme] Pourcentage de similitude de 2 fichiers
    Par Magy_4 dans le forum Algorithmes et structures de données
    Réponses: 4
    Dernier message: 08/11/2002, 22h42

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo