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 :

[Débutant] script pour compter valeur d'une colonne selon condition


Sujet :

Langage Perl

  1. #1
    Membre à l'essai Avatar de FryHandiz
    Femme Profil pro
    Étudiant
    Inscrit en
    Mars 2016
    Messages
    26
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2016
    Messages : 26
    Points : 12
    Points
    12
    Par défaut [Débutant] script pour compter valeur d'une colonne selon condition
    Bonjour !

    Je reviens pour un petit coup de main.
    Alors voilà, j'ai une liste de fichiers un peu comme ça :
    1.txt
    2.txt
    ...
    Et chaque fichier est composé de deux colonnes (séparateur : tabulation) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    1    1
    1    1
    13    1
    24    1
    33    1
    Je souhaite traiter la première colonne. En effet, j'aimerais pouvoir compter le nombre de ligne où la première valeur est entre 0 et 100, puis 100 et 1000, etc.

    Donc ça, je sais le faire pour un fichier mais en ligne de commande, une ligne pour chaque tranche de valeur.
    Mais vu le nombre de fichier que j'ai, je ne peux pas me permettre ça, je pensais alors faire un script déjà pour faire ceci dans un fichier.
    J'ai commencé comme ça :

    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
    #!/ usr/bin/env perl
     
    use strict;
    use warnings;
     
    if ($#ARGV != 0) # rentrer fichier à analyser en arguments
    {
            die "\n\tUsage: $0 Filename\n\n"
    }
     
    open C,"<$ARGV[0]" or die "Impossible d'ouvrir le fichier";
     
     
    while (my $ligne = <C>)
    {
    	chomp $ligne;
        my $valeur = $1 if $ligne =~ /^(\d+)/; #je stock le premier chiffre de mes lignes.
        if ($valeur<100)
        {
            print "$ligne\n";
        }
     
        if (($valeur>=100) && ($valeur<1000))
        {
            print "$ligne\n";
        }
     
    }
    Bon, ça me print les lignes mais... J'aimerais bien que ça me les compte plutôt !
    Auriez-vous un petit conseil ? Dois-je utiliser une table de hachage ? Mici.

  2. #2
    Membre habitué
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Juillet 2014
    Messages
    84
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur intégration
    Secteur : Conseil

    Informations forums :
    Inscription : Juillet 2014
    Messages : 84
    Points : 197
    Points
    197
    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
    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
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    #!/usr/bin/perl -w
     
    use strict;
    use Data::Dumper;
    use File::Glob qw(bsd_glob);
     
     
    my $Path = "repertoire où sont présents les fichiers";
    my $Filefound;
     
    my $fileHandle;
    my %hashComptage;
    my %hashDetermination;
    my $cle;
    my $valeurFichier;
     
    foreach my $file(get_files($Path) ){
    	open ($fileHandle, "<", $file) or die "Impossible d'ouvrir le fichier";
    	while( <$fileHandle> ){
    		chomp;
    		next unless length;
    		($cle, $valeurFichier ) = split( /\t/, $_ );
    		$hashComptage{$cle}++;
    	}
    	close( $fileHandle );
    }
    print Dumper( \%hashComptage );
     
     
    foreach (grep( {$_>=0 and $_<100} keys(%hashComptage))){
    	print "$_\n";
    	$hashDetermination{"0-100"} += $hashComptage{$_};
    }
    foreach (grep( {$_>=100 and $_<1000} keys(%hashComptage))){
    	print "$_\n";
    	$hashDetermination{"100-1000"} += $hashComptage{$_};
    }
     
    print Dumper( \%hashDetermination );
     
    sub get_files {
    	my $path = shift;
    	my @files;
     
    	print "Path :: $path\n";
    	#print "Content :: ".join("\n", @content);
    	for my $entry (bsd_glob("$path/*.*")) {
    		if (-f $entry) {
    			if( $entry =~ m/^.*fichier\d*\.txt$/ ){
    				push @files, $entry;
    			}
    		}
    	}
    	return @files;
    }
    testé de mon coté. Je pense que la partie la plus compliqué sera le traitement en fonction des tranches (0-100 puis 100-1000 etc)

  3. #3
    Membre à l'essai Avatar de FryHandiz
    Femme Profil pro
    Étudiant
    Inscrit en
    Mars 2016
    Messages
    26
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2016
    Messages : 26
    Points : 12
    Points
    12
    Par défaut
    Je crois que j'aurai dû préciser que j'étais débutante
    Alors, tout d'abord, merci pour ta réponse JeanMi ! J'ai testé chez moi et ça ne marche pas, mais sûrement parce que je n'ai pas tout à fait compris !
    Du coup, si ça ne t'ennuie pas, j'ai quelques questions.
    D'abord, pourquoi à la première ligne il y a -w ?
    Ensuite, à quoi sert Glob qw(bsd_glob) ? C'est un peu pour définir le path ?
    Je n'ai pas trop compris ce que c'était et à quoi ça servait ça : next unless length;

    Merci !

  4. #4
    Membre habitué
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Juillet 2014
    Messages
    84
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur intégration
    Secteur : Conseil

    Informations forums :
    Inscription : Juillet 2014
    Messages : 84
    Points : 197
    Points
    197
    Par défaut
    J'ai posté un peu vite car c'était l'heure de manger.

    D'abord, pourquoi à la première ligne il y a -w ?
    ça remplace la pragma 'use warnings'.
    je pense que c'est une erreur de l'utiliser. En fait j'ai adapté plusieurs bouts de code pour te fournir une réponse, du coup il reste quelques coquilles.

    Ensuite, à quoi sert Glob qw(bsd_glob) ? C'est un peu pour définir le path ?
    c'est une fonction qui revoie la liste des éléments (fichiers et répertoires) présents dans le répertoire fourni.

    Je n'ai pas trop compris ce que c'était et à quoi ça servait ça : next unless length;
    ça permet de ne pas traiter la ligne du fichier en cours si celle-ci est vide.

    Pour utiliser correctement le script fourni, il faut renseigner la variable $Path et vérifier la regex ligne 47 (au besoin).
    Je filtre volontairement les éléments du répertoire pour ne garder que ceux qui commencent par le terme 'fichier' suivi d'un nombre et finissant par '.txt' (ex : fichier1.txt, fichier2.txt ... )

  5. #5
    Membre à l'essai Avatar de FryHandiz
    Femme Profil pro
    Étudiant
    Inscrit en
    Mars 2016
    Messages
    26
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2016
    Messages : 26
    Points : 12
    Points
    12
    Par défaut
    J'avais en effet changer mais j'avais oublié un petit /
    Hihi
    Donc du coup ça marche, ça me donne le résultat pour tous les fichiers en une fois mais moi j'aimerais bien l'avoir pour chaque fichier, enfin, je vais me débrouiller pour ça et je reviendrais si je galère, héhé.
    Juste pour savoir, il y a moyen de le faire sans la fonction get_files non ? Juste pour savoir si je peux m'aventurer sans ! Car pour moi les fonctions c'est encore un peu difficile (je demande pas le bout de code pour, juste savoir si on peut passer outre ^^)
    Encore merciiii !

  6. #6
    Membre habitué
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Juillet 2014
    Messages
    84
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur intégration
    Secteur : Conseil

    Informations forums :
    Inscription : Juillet 2014
    Messages : 84
    Points : 197
    Points
    197
    Par défaut
    Citation Envoyé par FryHandiz Voir le message
    Juste pour savoir, il y a moyen de le faire sans la fonction get_files non ?
    oui, bien sur que c'est possible.
    Je l'utilise par simplicité et parce que c'est un bout de code récurrent dans mes scripts.

  7. #7
    Membre à l'essai Avatar de FryHandiz
    Femme Profil pro
    Étudiant
    Inscrit en
    Mars 2016
    Messages
    26
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2016
    Messages : 26
    Points : 12
    Points
    12
    Par défaut
    Dac, encore merci JeanMi !

  8. #8
    Membre actif Avatar de olivier1969
    Homme Profil pro
    Assistant aux utilisateurs
    Inscrit en
    Novembre 2013
    Messages
    151
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Assistant aux utilisateurs
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Novembre 2013
    Messages : 151
    Points : 208
    Points
    208
    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
    13
    14
    15
    16
     
    my @fic = <C>;
    foreach my $ligne (@fic) {
    	@trans = split (/ /, $ligne );
        my $valeur = $trans[1]; #je stock le premier chiffre de mes lignes.
        if ($valeur<100)
        {
            print "$ligne\n";
        }
     
        if (($valeur>=100) && ($valeur<1000))
        {
            print "$ligne\n";
        }
     
    }
    Quelque chose dans ce genre devrai fonctionner , sans fonction ...

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

Discussions similaires

  1. [MySQL] Créer une section pour chaque valeur d'une colonne
    Par helrick dans le forum PHP & Base de données
    Réponses: 5
    Dernier message: 14/08/2013, 00h23
  2. [2008] Changement de valeur d'une colonne selon condition
    Par jubourbon dans le forum SSIS
    Réponses: 3
    Dernier message: 08/03/2012, 18h14
  3. Formule compter valeurs d'une colonne sans doublons
    Par spark_legion dans le forum Modélisation
    Réponses: 2
    Dernier message: 05/05/2011, 14h12
  4. [XL-2003] Compter valeurs d'une colonne en fonction d'une autre colonne
    Par greggy dans le forum Excel
    Réponses: 2
    Dernier message: 03/11/2009, 12h51
  5. TRIGGER - définir la valeur d'une colonne selon une autre
    Par gmonta31 dans le forum SQL Procédural
    Réponses: 1
    Dernier message: 19/04/2008, 03h55

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