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

Programmation et administration système Perl Discussion :

stocker le nombre de fichier de chaque type dans une table de hach


Sujet :

Programmation et administration système Perl

  1. #1
    Futur Membre du Club
    Inscrit en
    Septembre 2008
    Messages
    13
    Détails du profil
    Informations forums :
    Inscription : Septembre 2008
    Messages : 13
    Points : 5
    Points
    5
    Par défaut stocker le nombre de fichier de chaque type dans une table de hach
    Bonjour a tous, j'aimerai scanner un certain de nombre de fichiers et mettre dans une table de hach chaque type de fichier et le nombre de chaque type

    exemple:

    J'ai un dossier qui contient 10 fichiers
    j'ai besoin d'une table de hash qui me sorte:
    jpg ---> 3
    doc ---> 5
    bat ---> 2

    Voici le code

    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
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    #!C:\perl\bin\perl.exe
     
    use warnings; # ah les warning
    use DB_File; # la base de donnees mon %hache
    use strict; # pour les controles classiques
    use File::Find; # pour le trt des fichiers (metadonnees)
    use File::Copy; # pour copier les fichiers ancien_nom nouveau_nom
    use Image::ExifTool ':Public'; # trouver sur Internet "http://www.sno.phy.queensu.ca/~phil/exiftool/" cf methode 'ImageInfo($fichier)';
    use POSIX qw/strftime/; #pour récupérer la date
     
     
     
    my (%hache2, $cle, $valeur);
     
    # je veux pré alouer de la mémoire a mon %hache plus de 2 millions de paires 'cles/valeurs'
    keys(%hache2) = 2097152;
     
    # C'est le repertoire du programme le point de depart
    my $dir = "C:\\mestraitements\\atach\\";
     
     
     
    #1################################################################################################################################
    #1##################### D?but comptage de repertoires ############################################################################
    #1################################################################################################################################
     
    # ouvre le repertoire $dir
    opendir( DIR, $dir ) or die "Impossible d'ouvrir $dir: $!";
     
    # récupère la liste des sous-répertoires de $dir dans @subdirs
    my @subdirs = grep { -d } readdir(DIR);
     
    #@subdirs2 est la liste des sous-répertoires de @subdirs contenant le mot pica
    my @subdirs2 = grep($_ =~ /pica/, @subdirs);
     
     
        closedir(DIR);
     
    #1################################################################################################################################
    #1####################	Fin comptage de repertoires	##############################################################################
    #1################################################################################################################################
     
     
     
    #2# ATTENTION TRES IMPORTANT
    #2# je detruit la mémoire.... A EVITER +++++
    #2# ne pratiquer que si je veux faire un RESET.....COMPLET
    #2################################################################################################################################
    #2####################	Ligne de destruction de la base d'index	##################################################################
    #2################################################################################################################################
    #2#################### 	à n'activer que lors d'un reset complet 	##############################################################
    #2################################################################################################################################
     
    unlink "ma_base_de_type" ; #### /!\  attention, CF warning au dessus. /!\ ######################################################
     
    #2################################################################################################################################
    #2####################     Fin Ligne de destruction de la base d'index	##########################################################
    #2################################################################################################################################
     
     
     
     
    ## Les ouvertures de connections
    # la connection a la base persistante hache
    tie %hache2, "DB_File", "ma_base_de_type", O_RDWR|O_CREAT, 0666, $DB_HASH or die "Cannot open file 'ma_base_d_index': $!\n";
    # Le handle de fichier pour lister tous les documents des repertoires utilisés, la TRACE
    #open (SORTIE, ">nom_des_documents_analyses.txt") || die 'le fichier erreurs.txt impossible ';
     
    # zooooooooo l'oeil du cyclonnnnnnnnneeeeeeeee
    # Ah la recursiviteeeeeeeeee ouaaahhhhhhhhh
     
    find(\&traite_fichier, @subdirs2);
     
     
     
     
      while (($cle, $valeur) = each %hache2)
       { print "$cle -> $valeur\n" };
     
     
    untie %hache2;
     
     
    #4#################################################################################################################################
    #4#################################################################################################################################
    #4# Ma fonction MAGIQUE...non #####################################################################################################
    #4#################################################################################################################################
     
    sub traite_fichier
    {
    		my $type = "";
           # initialisation du nom de fichier je passe par la variable locale "$_"
            my $fichier = $_;
     
           # la trace des fichiers analyses, tous les fichiers de tous les repertoires oui tous...;
            #print SORTIE "$fichier\n";
     
           # j'étudie les meta données
            my $info = ImageInfo($fichier);
     
            my $type = $info->{FileType};
     
            if (exists($hache2{$type}))
    		{
    			$hache2{$type} = $hache2{$type}++;
    		}
     
    		else
    		{
    			$hache2{$type} = 1;
    		}
    }

  2. #2
    Membre émérite
    Avatar de Jasmine80
    Femme Profil pro
    Bioinformaticienne
    Inscrit en
    Octobre 2006
    Messages
    3 157
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 44
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Bioinformaticienne
    Secteur : Santé

    Informations forums :
    Inscription : Octobre 2006
    Messages : 3 157
    Points : 2 673
    Points
    2 673
    Par défaut
    Bonjour a tous, j'aimerai scanner un certain de nombre de fichiers et mettre dans une table de hach chaque type de fichier et le nombre de chaque type

    j'ai besoin d'une table de hash qui me sorte:
    jpg ---> 3
    doc ---> 5
    bat ---> 2
    Tu peux faire similaire à
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    #@subdirs2 est la liste des sous-répertoires de @subdirs contenant le mot pica
    my @subdirs2 = grep($_ =~ /pica/, @subdirs);

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    my @files = grep($_ =~ /\.jpg$/, @subdirs); 
    print 'nbr de fichiers :'.@files."\n";
    my $hash{'jpg'} = @nbr;
    $ étant l'ancre de fin assurant qu'aucun autre caractère ne suit.
    -- Jasmine --

  3. #3
    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 : 499 184
    Points
    499 184
    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
    my $Repertoire = "./";
    my %TypeFichiers;
     
    opendir (REP, $Repertoire ) or die "impossible d'ouvrir le repertoire $Repertoire\n";
    foreach my $Fichier ( grep { !/^\.\.?$/ and -f $_ } readdir(REP) ) {
      my ($Type) = $Fichier =~ m{\.(\w+)$};
      $TypeFichiers{$Type} ++;
    }
    close (REP);
     
    #============
    # Correspondances
    foreach ( sort keys %TypeFichiers ) {
      print "$_ : $TypeFichiers{$_}\n";
    }

  4. #4
    Futur Membre du Club
    Inscrit en
    Septembre 2008
    Messages
    13
    Détails du profil
    Informations forums :
    Inscription : Septembre 2008
    Messages : 13
    Points : 5
    Points
    5
    Par défaut
    tout d'abord merci a vous.

    pour Jasmine80, je ne peux pas faire comme pour les dossiers car je ne connais pas tous les type des fichiers. (on parle de million de fichiers)

    Pour djibril, je vais tester. Cependant j'aimerai que ce soit dans une table de hash qui sera stocker dans un fichier pour ensuite pouvoir exploiter le dit fichier

    edit: Djibril ton system fonctionne

    voilà ce que ca donne:

    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
    #!C:\perl\bin\perl.exe
     
    use warnings; # ah les warning
    use DB_File; # la base de donnees mon %hache
    use strict; # pour les controles classiques
    use File::Find; # pour le trt des fichiers (metadonnees)
    use File::Copy; # pour copier les fichiers ancien_nom nouveau_nom
    use Image::ExifTool ':Public'; # trouver sur Internet "http://www.sno.phy.queensu.ca/~phil/exiftool/" cf methode 'ImageInfo($fichier)';
    use POSIX qw/strftime/; #pour récupérer la date
     
     
     
    #my (%hache2, $cle, $valeur);
     
    # je veux pré alouer de la mémoire a mon %hache plus de 2 millions de paires 'cles/valeurs'
     
     
    # C'est le repertoire du programme le point de depart
    my $dir = "C:\\mestraitements\\atach\\";
    my %TypeFichiers;
     
     
     
    #1################################################################################################################################
    #1##################### D?but comptage de repertoires ############################################################################
    #1################################################################################################################################
     
    # ouvre le repertoire $dir
    opendir( DIR, $dir ) or die "Impossible d'ouvrir $dir: $!";
     
    # récupère la liste des sous-répertoires de $dir dans @subdirs
    my @subdirs = grep { -d } readdir(DIR);
     
    #@subdirs2 est la liste des sous-répertoires de @subdirs contenant le mot pica
    my @subdirs2 = grep($_ =~ /pica/, @subdirs);
     
     
        closedir(DIR);
     
    #1################################################################################################################################
    #1####################	Fin comptage de repertoires	##############################################################################
    #1################################################################################################################################
     
    opendir (REP, $dir ) or die "impossible d'ouvrir le repertoire $dir\n";
    foreach my $Fichier ( grep { !/^\.\.?$/ and -f $_ } readdir(REP) ) {
      my ($Type) = $Fichier =~ m{\.(\w+)$};
      $TypeFichiers{$Type} ++;
    }
    close (REP);
     
    #============
    # Correspondances
    foreach ( sort keys %TypeFichiers ) {
      print "$_ : $TypeFichiers{$_}\n";
    }
    Le problème c'est que le "truc" ne fonction que pour le repertoire $dir et non pour tous les repertoire contenu dans la chaine subdirs2.

    Une solution?

  5. #5
    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 : 499 184
    Points
    499 184
    Par défaut
    c'est pas clair ce que tu souhaites.
    Tu as déjà tout ce qu'il te faut.
    Que veux tu exactement? lister tous les fichiers de plusieurs répertoires et tout mettre dans un seul hash?

    Soit plus clair

  6. #6
    Futur Membre du Club
    Inscrit en
    Septembre 2008
    Messages
    13
    Détails du profil
    Informations forums :
    Inscription : Septembre 2008
    Messages : 13
    Points : 5
    Points
    5
    Par défaut
    Voilà c'est ca,

    Le code que tu m'as filer, fonctionne avec le repertoire qui est défini dans $Repertoire.

    J'ai besoin de connaitre les types de fichiers dans 10 repertoires différent et j'aimerai que le script fonctionne d'un coup pour les 10 repertoires.

    D'ou ma liste @subdirs2

    Donc en gros il faudrai appliquer ton code sur tous les dossiers contenu dans la liste @subdirs2.

  7. #7
    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 : 499 184
    Points
    499 184
    Par défaut
    Voilà, tu as tout ce qu'il 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
    my @TousMesRepertoires = ("C:/Perl/bin","C:/mestraitements/atach/", ".");
    my %TypeFichiers;
     
    foreach my $Repertoire ( @TousMesRepertoires ) {
      ListerTypeFichier($Repertoire, \%TypeFichiers);
    }
     
     
    #============
    # Correspondances
    foreach ( sort keys %TypeFichiers ) {
      print "$_ : $TypeFichiers{$_}\n";
    }
     
    #========================
    # - Liste les type de fichier dans un repertoire
    # - Le rajoute au hash soumis
    sub ListerTypeFichier {
      my ( $Repertoire, $RefHash ) = @_;
      opendir (REP, $Repertoire ) or die "impossible d'ouvrir le repertoire $Repertoire\n";
      my @RepFichier = grep { !/^\.\.?$/ and -f "$Repertoire/$_" } readdir(REP);
     
      foreach my $Fichier ( @RepFichier ) {
        my ($Type) = $Fichier =~ m{\.(\w+)$};
        $Type = "PasExtension" if ( not defined $Type );
        $RefHash->{$Type} ++;
      }
      close (REP);
     
      return;
    }

  8. #8
    Futur Membre du Club
    Inscrit en
    Septembre 2008
    Messages
    13
    Détails du profil
    Informations forums :
    Inscription : Septembre 2008
    Messages : 13
    Points : 5
    Points
    5
    Par défaut
    Merci

Discussions similaires

  1. Réponses: 2
    Dernier message: 24/04/2014, 10h39
  2. nombre de fichiers de repertoires contenus dans une liste
    Par morty dans le forum Général Python
    Réponses: 3
    Dernier message: 12/06/2009, 01h46
  3. Réponses: 5
    Dernier message: 11/10/2006, 02h26
  4. Problème de Type dans une table liée
    Par tangueros78 dans le forum Access
    Réponses: 19
    Dernier message: 16/03/2006, 09h14
  5. Position de chaque ligne dans une table
    Par steelidol dans le forum MS SQL Server
    Réponses: 3
    Dernier message: 16/02/2006, 14h34

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