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

Langage Perl Discussion :

lecture fichier texte + moyenne et ecart type


Sujet :

Langage Perl

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    87
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 87
    Points : 59
    Points
    59
    Par défaut lecture fichier texte + moyenne et ecart type
    Bonjour,

    Je suis débutant en perl et je voudrais avoir un script qui calcule la moyenne et l'ecart type des notes attribuées aux vidéos (num_video) à partir du fichier suivant

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    num_video: 1 - note: 9 - fgt - age: 27 - pratique: oui - duree: oui
    num_video: 12 - note: 8 - fgt - age: 27 - pratique: oui - duree: oui
    num_video: 15 - note: 9 - fgt - age: 27 - pratique: oui - duree:  - -
    num_video: 14 - note: 9 - MB - age: 30 - pratique: oui - duree:  - -
    num_video: 17 - note: 8 - MB - age: 30 - pratique: oui - duree: oui
    num_video: 12 - note: 9 - MB - age: 30 - pratique: oui - duree: oui
    num_video: 17 - note: 9 - mhb - age: 29 - pratique: oui - duree:  - -
    num_video: 28 - note: 8 - mhb - age: 29 - pratique: oui - duree: oui
    num_video: 12 - note: 5 - noly - age: 34 - pratique: non - duree:  - -
    num_video: 1 - note: 8 - noly - age: 34 - pratique: non - duree: non
    num_video: 3 - note: 6 - noly - age: 34 - pratique: non - duree:  - -
    num_video: 5 - note: 4 - JPC - age: 52 - pratique: non - duree: non
    num_video: 12 - note: 6 - JPC - age: 52 - pratique: non - duree: non
    num_video: 17 - note: 7 - JPC - age: 52 - pratique: non - duree:  - -
    Merci de votre aide ^^

  2. #2
    Rédacteur/Modérateur

    Avatar de Lolo78
    Homme Profil pro
    Conseil - Consultant en systèmes d'information
    Inscrit en
    Mai 2012
    Messages
    3 612
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Conseil - Consultant en systèmes d'information
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2012
    Messages : 3 612
    Points : 12 256
    Points
    12 256
    Billets dans le blog
    1
    Par défaut
    Et tu as essayé de coder quelque chose? Tu éprouves des difficultés particulières?

    Ce site est un forum d'entre-aide, pas un service gratuit de fourniture de code. Montre tes efforts en expliquant les difficultés que tu rencontres, et l'on sera ravi de t'aider.

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    87
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 87
    Points : 59
    Points
    59
    Par défaut
    Oui bien sur

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    #!/usr/bin/perl
    use strict;
    use warnings;
     
    use Statistics::Basic qw/:all/;
     
    my @nums;
     
    while (<>) {
    	my @row = split / - /;
    	my ($score) = $row[1] =~ /note: (\d+)/;
    	push @nums, $score if $score;
    }
     
    my $avg = mean(@nums);
    print "Avg: $avg\n";
     
    my $stddev = stddev(@nums);
    print "Stddev: $stddev\n";
    Ca ne marche pas d'une part, d'autre part comment est ce que je peux lire le fichier avant ce code?

    Merci

  4. #4
    Membre du Club
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    87
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 87
    Points : 59
    Points
    59
    Par défaut
    Pour etre plus précis, j'ai des difficultés avec le module statistics
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Can't locate Statistics/Basic.pm in @INC (you may need to install the Statistics::Basic module) (@INC contains: C:/Perl/site/lib C:/Perl/lib .) a
    t C:\perlessai.pl line 5.
    Comment est ce que je peux fixer le problème? ou bien y a t-il une solution plus simple qui n'utilise pas ce module?
    Merci d'avance

  5. #5
    Membre du Club
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    87
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 87
    Points : 59
    Points
    59
    Par défaut
    J'ai bien cherché et finalement j'ai pu résoudre le problème d'installation de module. avec Par contre, le script suivant, calcule la moyenne et l'ecart type sur toutes les notes de toutes les vidéos

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
     
    #!/usr/bin/perl
    use strict;
    use warnings;
     
    use Statistics::Basic qw/:all/;
     
    my @nums;
     
    my $file = 'data.txt';
    open my $fh, "<", $file or die "can't open < $file: $!";
     
    while (<$fh>){
    	my @row = split / - /;
    	my ($score) = $row[1] =~ /note: (\d+)/;
    	push @nums, $score if $score;
    }
     
    my $avg = mean(@nums);
    print "Avg: $avg\n";
     
    my $stddev = stddev(@nums);
    print "Stddev: $stddev\n";
    Ce que je veux faire, c'est de calculer la moyenne et l'ecartype des notes pour chaque vidéo

    exemple:

    num_video : 1 - note : 10
    num_video : 2 - note : 10
    num_video : 1 - note : 8
    num_video : 1 - note : 6
    num_video : 3 - note : 2
    num_video : 2- note : 8

    resultat:

    pour video 1 : mean= 6 ; stddev = ?
    pour video 2 : mean= 9 ; stddev = ?
    pour video 3 : mean= 2 ; stddev = 0
    Merci pour votre aide

  6. #6
    Responsable Perl et Outils

    Avatar de djibril
    Homme Profil pro
    Inscrit en
    Avril 2004
    Messages
    19 820
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 19 820
    Points : 498 771
    Points
    498 771
    Par défaut
    Bonsoir,

    Il suffit de stocker les données dans un hash et traiter ce dernier en fin de lecture du fichier.

    Exemple : data.txt
    Code x : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    num_video: 1 - note: 9 - fgt - age: 27 - pratique: oui - duree: oui
    num_video: 12 - note: 8 - fgt - age: 27 - pratique: oui - duree: oui
    num_video: 15 - note: 9 - fgt - age: 27 - pratique: oui - duree:  - -
    num_video: 14 - note: 9 - MB - age: 30 - pratique: oui - duree:  - -
    num_video: 17 - note: 8 - MB - age: 30 - pratique: oui - duree: oui
    num_video: 12 - note: 9 - MB - age: 30 - pratique: oui - duree: oui
    num_video: 17 - note: 9 - mhb - age: 29 - pratique: oui - duree:  - -
    num_video: 28 - note: 8 - mhb - age: 29 - pratique: oui - duree: oui
    num_video: 12 - note: 5 - noly - age: 34 - pratique: non - duree:  - -
    num_video: 1 - note: 8 - noly - age: 34 - pratique: non - duree: non
    num_video: 3 - note: 6 - noly - age: 34 - pratique: non - duree:  - -
    num_video: 5 - note: 4 - JPC - age: 52 - pratique: non - duree: non
    num_video: 12 - note: 6 - JPC - age: 52 - pratique: non - duree: non
    num_video: 17 - note: 7 - JPC - age: 52 - pratique: non - duree:  - -
    num_video : 1 - note : 10
    num_video : 2 - note : 10
    num_video : 1 - note : 8
    num_video : 1 - note : 6
    num_video : 3 - note : 2
    num_video : 2- note : 8

    Programme :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    #!/usr/bin/perl
    use strict;
    use warnings;
     
    use Statistics::Basic qw/:all/;
     
    my %videos;
     
    my $file = 'data.txt';
    open my $fh, "<", $file or die "can't open < $file: $!";
     
    while (my $ligne = <$fh>) {
     
    	# Lecture numéro vidéo et note
    	my ( $num, $note ) = $ligne =~ /num_video\s*:\s*(\d+)\s*-\s*note\s*:\s*(\d+)/;
     
    	if ( defined $num and defined $note ) {
    		if ( exists $videos{$num} ) {
     
    			# Rajout d'une note à la liste déjà présente d'un tableau anonyme contenant la note
    			push @{ $videos{$num} }, $note;
    		}
    		else {
    			# Création d'un tableau anonyme contenant la note
    			$videos{$num} = [$note];
    		}
    	}
    }
    close $fh;
     
    # Lecture des notes pour calculer les moyenne et écart type
    foreach my $num_videos ( sort { $a <=> $b } keys %videos ) {
    	print "videos : $num_videos, Avg: "
    	  . mean( @{ $videos{$num_videos} } )
    	  . ", Stddev: "
    	  . stddev( @{ $videos{$num_videos} } ) . "\n";
    }
    Résultat :
    Code x : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    videos : 1, Avg: 8.2, Stddev: 1.33
    videos : 2, Avg: 9, Stddev: 1
    videos : 3, Avg: 4, Stddev: 2
    videos : 5, Avg: 4, Stddev: 0
    videos : 12, Avg: 7, Stddev: 1.58
    videos : 14, Avg: 9, Stddev: 0
    videos : 15, Avg: 9, Stddev: 0
    videos : 17, Avg: 8, Stddev: 0.82
    videos : 28, Avg: 8, Stddev: 0

  7. #7
    Membre du Club
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    87
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 87
    Points : 59
    Points
    59
    Par défaut
    Parfait
    Merci djibril ^^

  8. #8
    Membre averti
    Avatar de magicshark
    Homme Profil pro
    Dans une SS2I donc pas que JAVA
    Inscrit en
    Octobre 2011
    Messages
    133
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Dans une SS2I donc pas que JAVA
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2011
    Messages : 133
    Points : 320
    Points
    320
    Par défaut
    Bonjour, j'ai regarder le code que tu as fournit Djibril mais je ne comprend pas l’intérêt des deux autres programmes à la suite ?
    Le premier semble tester l’existence d'un module sur la machine et le second fais des connexion ssh (ce qui ne semble pas être en rapport avec la question posé. aurais tu fais un mauvais copié coller ?
    Pourquoi faire simple quand on peut faire compliqué.

  9. #9
    Rédacteur/Modérateur

    Avatar de Lolo78
    Homme Profil pro
    Conseil - Consultant en systèmes d'information
    Inscrit en
    Mai 2012
    Messages
    3 612
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Conseil - Consultant en systèmes d'information
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2012
    Messages : 3 612
    Points : 12 256
    Points
    12 256
    Billets dans le blog
    1
    Par défaut
    Bonjour,

    je pense que Djibril a simplement été la victime de ce que l'on appelle un copier-foirer.

  10. #10
    Membre averti
    Avatar de magicshark
    Homme Profil pro
    Dans une SS2I donc pas que JAVA
    Inscrit en
    Octobre 2011
    Messages
    133
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Dans une SS2I donc pas que JAVA
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2011
    Messages : 133
    Points : 320
    Points
    320
    Par défaut
    Ah pas mal je connaissais pas l'expression
    Pourquoi faire simple quand on peut faire compliqué.

  11. #11
    Responsable Perl et Outils

    Avatar de djibril
    Homme Profil pro
    Inscrit en
    Avril 2004
    Messages
    19 820
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 19 820
    Points : 498 771
    Points
    498 771
    Par défaut
    En effet, copier/foirer . Je bossais sur mon programme poubelle de test

  12. #12
    Membre du Club
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    87
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 87
    Points : 59
    Points
    59
    Par défaut
    J'ai une autre question concernant le code de Djibril..
    Comment pourrais je ajouter le nombre de notes attribuées pour chaque video

    exemple:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    pour video 1 : mean= 6 ; stddev = ? ; nombre=3
    pour video 2 : mean= 9 ; stddev = ? ; nombre=2
    pour video 3 : mean= 2 ; stddev = 0 ; nombre = 1
    Merci

  13. #13
    Rédacteur/Modérateur

    Avatar de Lolo78
    Homme Profil pro
    Conseil - Consultant en systèmes d'information
    Inscrit en
    Mai 2012
    Messages
    3 612
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Conseil - Consultant en systèmes d'information
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2012
    Messages : 3 612
    Points : 12 256
    Points
    12 256
    Billets dans le blog
    1
    Par défaut
    Tu peux ajouter un hash de compteurs, o, plus simplement, compter ne nombre d'éléments dans le hachage %vidéo. Par exemple en modifiant ainsi las boucle finale du code de Djibril (pas du tout testé):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    foreach my $num_videos ( sort { $a <=> $b } keys %videos ) {
    	print "videos : $num_videos, Avg: "
    	  . mean( @{ $videos{$num_videos} } )
    	  . ", Stddev: "
    	  . stddev( @{ $videos{$num_videos} } ) 
              . ", décompte: " . scalar @{ $videos{$num_videos} } . "\n";
    }
    A noter que le module Statistics::Basic doit aussi fournir une fonction de décompte des éléments, mais pas le temps de vérifier là maintenant.

  14. #14
    Membre du Club
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    87
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 87
    Points : 59
    Points
    59
    Par défaut
    Merci Lolo78 pour ta réponse, Je vais tester

  15. #15
    Membre du Club
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    87
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 87
    Points : 59
    Points
    59
    Par défaut
    Merci pour tout le monde
    c'est ok, c'est résolu

    Je voudrais comme même poser une autre question, est ce possible la boucle for qui calcule la moyenne, le nombre et l'ecartype de chaque numero :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    # Lecture des notes pour calculer les moyenne et écart type
     
    foreach my $num_videos ( sort { $a <=> $b } keys %videos ) {
    	print "videos : $num_videos, Avg: "
    	  . mean( @{ $videos{$num_videos} } )
    	  . ", Stddev: "
    	  . stddev( @{ $videos{$num_videos} } ) 
              . ", Nombre: " . scalar @{ $videos{$num_videos} } . "\n";
    }
    De telle façon que le calcul de la moyenne, le nombre et l'ecart type ne se fait pas pour chaque numero, mais pour chaque groupe de numéro (stocké dans un tableau par exemple)

    exemple:

    num_video: 1 - note: 9 - fgt - age: 27 - pratique: oui - duree: oui
    num_video: 12 - note: 8 - fgt - age: 27 - pratique: oui - duree: oui
    num_video: 15 - note: 9 - fgt - age: 27 - pratique: oui - duree: - -
    num_video: 14 - note: 9 - MB - age: 30 - pratique: oui - duree: - -
    num_video: 17 - note: 8 - MB - age: 30 - pratique: oui - duree: oui
    num_video: 12 - note: 9 - MB - age: 30 - pratique: oui - duree: oui
    num_video: 17 - note: 9 - mhb - age: 29 - pratique: oui - duree: - -
    num_video: 28 - note: 8 - mhb - age: 29 - pratique: oui - duree: oui
    num_video: 12 - note: 5 - noly - age: 34 - pratique: non - duree: - -
    num_video: 1 - note: 8 - noly - age: 34 - pratique: non - duree: non
    num_video: 3 - note: 6 - noly - age: 34 - pratique: non - duree: - -
    num_video: 5 - note: 4 - JPC - age: 52 - pratique: non - duree: non
    num_video: 12 - note: 6 - JPC - age: 52 - pratique: non - duree: non
    num_video: 17 - note: 7 - JPC - age: 52 - pratique: non - duree: - -
    num_video : 1 - note : 10
    num_video : 2 - note : 10
    num_video : 1 - note : 8
    num_video : 1 - note : 6
    num_video : 3 - note : 2
    num_video : 2- note : 8
    calculer la moyenne, le nombre et l'ecart type des notes correspondant au num_video : 1 , 3, 15 et 17

    Merci beaucoup

  16. #16
    Rédacteur/Modérateur

    Avatar de Lolo78
    Homme Profil pro
    Conseil - Consultant en systèmes d'information
    Inscrit en
    Mai 2012
    Messages
    3 612
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Conseil - Consultant en systèmes d'information
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2012
    Messages : 3 612
    Points : 12 256
    Points
    12 256
    Billets dans le blog
    1
    Par défaut
    Oui, c'est possible, tout est possible, mais c'est probablement un autre programme. Là, le programme proposé par Djibril est fait pour calculer les éléments individuellement, faire des agrégats demande une démarche assez différente et entraînerait des verrues assez laides dans ce programme. Ou alors des fonctions complètement différentes. Il vaut mieux faire un autre programme dans lequel, par exemple, tu ne listes que les numéros qui t'intéressent et fais ton calcul statistique global sur ces numéros.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Lecture fichier texte
    Par vince-60 dans le forum MS SQL Server
    Réponses: 1
    Dernier message: 06/04/2006, 14h15
  2. [VB]Probleme lecture fichier text et affichage
    Par clochardevobsy dans le forum VB 6 et antérieur
    Réponses: 3
    Dernier message: 10/03/2006, 08h46
  3. lecture fichier texte et ...
    Par Nils30 dans le forum Langage
    Réponses: 5
    Dernier message: 12/01/2006, 11h55
  4. lecture fichier text et renvoi du contenu en byte *
    Par JulienT dans le forum Réseau
    Réponses: 3
    Dernier message: 02/01/2006, 13h21
  5. Lecture fichier text
    Par krfa1 dans le forum ASP
    Réponses: 13
    Dernier message: 25/11/2005, 08h00

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