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 :

récupérations info fichier 2 (Baldric de Dol)


Sujet :

Programmation et administration système Perl

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éprouvé
    Avatar de Jasmine80
    Femme Profil pro
    Bioinformaticienne
    Inscrit en
    Octobre 2006
    Messages
    3 157
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 45
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Bioinformaticienne
    Secteur : Santé

    Informations forums :
    Inscription : Octobre 2006
    Messages : 3 157
    Par défaut récupérations info fichier 2 (Baldric de Dol)
    J'ai pensé que refaire un post serait plus clair car bien que ce problème soit la continuité de récupérations info fichier, il pose des problèmes différents. Si les administrateurs pensent qu'il valait mieux le placer à la suite, ils pourront toujours le déplacer.

    Salut Jasmine, tes infos ont été précieuse, mais j'ai encore du mal à savoir comment faire certaines choses et le temps me manque malheureusement.

    je me permets de te redonner l'algorithme du programme que je cherche à faire:

    Citation:
    code n°1

    se déplacer dans des répertoires dont une partie de l'arborescence est la même
    ex:

    /chemin/(nom de dossier qui change)/dossier1/dossiera/(nom de dossier qui change 2)/(nom de dossier qui change 3)/
    /chemin/toto/dossier1/dossiera/repertoire1/datej-1/
    - fichier toto.xls
    - fichier tata.xls

    /chemin/tata/dossier1/dossiera/repertoire1/datej-1/
    - fichier toto.xls
    - fichier tata.xls

    /chemin/toto/dossier1/dossiera/repertoire2/datej-1/
    - fichier tutu.txt

    /chemin/tata/dossier1/dossiera/repertoire2/datej-1/
    - fichier tutu.txt

    liste de nom pour la partie dossier qui change

    @liste1 (michel, jean, edouard, dominique...) = nom de dossier qui change
    @liste2 (good, error) = nom de dossier qui change 2

    la 3e valeur changeante de dossier est une variable qui correspond à la date J-1 (donc hier)


    code n°2

    lister les informations de

    toto.xls
    tata.xls
    tutu.txt

    informations à lister et à inscrire dans un fichier plat

    -date du jour ou le script est joué pour récupérer les infos
    -nom de la personne qui a fait le fichier cf @liste1 et (nom de dossier qui change)
    -nom du fichier
    -date création du fichier
    -heure création du fichier

    pour chaque dossier


    si l'un des fichier est absent, seule la date et le nom de la personne doivent être récupérés
    j'ai trouvé que pour la variable date J-1 on fait
    Code :

    use DateTime;
    my $hier = DateTime->now->subtract( days => 1 );
    print "Hier était $hier\n";

    et j'ai rédigé en partie la fin de mon code (ouverture d'un fichier plat et inscription d'infos dedans) par un autre script qui transfère vers la BDD

    merci d'avance

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

    Informations professionnelles :
    Activité : Bioinformaticienne
    Secteur : Santé

    Informations forums :
    Inscription : Octobre 2006
    Messages : 3 157
    Par défaut
    se déplacer dans des répertoires dont une partie de l'arborescence est la même
    Voici un sous-programme qu'un administrateur de ce forum m'avait donné. Il te sera utile.
    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
    # But         : lister repertoires et sous repertoires.
    # Retourne  : tableau de repertoires
    # Necessite : rien
     
    sub lister_repertoires_recursif {
      unless( scalar(@_) == 1) {
        my $usage = <<'FIN_USAGE';
        Usage: lister_repertoires_recursif($repertoire);
    FIN_USAGE
        croak($usage);
       }
     
      my ($repertoire) = @_;
        opendir (REP, $repertoire) or
          die "impossible d'ouvrir le repertoire $repertoire\n";
        # récupérations de tous sauf . et ..
        my @file_rep = grep { !/^\.\.?$/ } readdir(REP);
        closedir (REP);
        my @repertoires = ();
        foreach my $nom (@file_rep) {
            # si $repertoire/$nom est un répertoire
            if ( -d "$repertoire/$nom") {
              push (@repertoires, "$repertoire/$nom");
              # on appel la fonction sur l'ensemble des dossiers contenus dans @repertoires
              push (@repertoires, &lister_repertoires_recursif("$repertoire/$nom"));
            }
        }
        return @repertoires;
    }
     
    # hash afin de pouvoir ultérieurement utiliser la fonction exists
    # et vérifier que tu retrouves tes 3 types de fichiers
     
    my %files_tot;
     
    foreach my $rep (@repertoires){
        opendir (DH, $rep) or die "Cannot open $rep";
        my @files = grep {$_ !~ /^\.\.?/} readdir DH;
        map {$files_tot{$_}=1;} @files;
        closedir (DH);
    }

    chemin/(nom de dossier qui change)/dossier1/dossiera/(nom de dossier qui change 2)/(nom de dossier qui change 3)/

    liste de nom pour la partie dossier qui change

    @liste1 (michel, jean, edouard, dominique...) = nom de dossier qui change
    @liste2 (good, error) = nom de dossier qui change 2

    la 3e valeur changeante de dossier est une variable qui correspond à la date J-1 (donc hier)

    Tu peux récupérer tes différents dossiers via une expression régulière. Si tu n'as pas absolument besoin d'un array, tu peux utiliser des clés de hash afin d'éviter les répétitions. Dans le cas d'array, tu peux utiliser le sous-programme sub supprime_doublon (que j'ai également obtenu par quelqu'un de ce forum).
    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
    my @change1;
    my @change2;
    my @change3;
     
    foreach my $file (keys %files_tot){
        if($file =~ 'chemin/(\w+)/\w+/\w+/(\w+)/(\w+)/'){
            push(@change1, $1);
            push(@change2, $2);
            push(@change3, $3);
        }
        else{
            print "erreur pour $file\n";
        }
    }
     
     
    my @result1 = &supprime_doublon(\@change1);
    my @result2 = &supprime_doublon(\@change12);
    my @result3 = &supprime_doublon(\@change3);
     
    sub supprime_doublon{
            my $self=shift;
            my %saw;
            my @result = @$self;	   #deréférence le tableau, donc on le récupère et le copie dans @result
      			           #pour eviter de travailler sur le tableau d'origine et le modifier.
            undef %saw;
            @saw{@result} = ();	   #chaque case de @result est mis en clef dans %saw avec une valeur nulle. et comme un
            @result = sort keys %saw;  #hash n'a pas deux clefs identiques, redondances supprimées.
            return(@result);
    }




    code n°2

    lister les informations de

    toto.xls
    tata.xls
    tutu.txt

    informations à lister et à inscrire dans un fichier plat

    -date du jour ou le script est joué pour récupérer les infos
    -nom de la personne qui a fait le fichier cf @liste1 et (nom de dossier qui change)
    -nom du fichier
    -date création du fichier
    -heure création du fichier

    pour chaque dossier


    si l'un des fichier est absent, seule la date et le nom de la personne doivent être récupérés
    j'ai trouvé que pour la variable date J-1 on fait
    Code :

    use DateTime;
    my $hier = DateTime->now->subtract( days => 1 );
    print "Hier était $hier\n";

    Quand tu dis que tu dois vérifier que tu as ces 3 fichiers
    toto.xls
    tata.xls
    tutu.txt

    que dois-tu exactement retrouver? Auront-ils à chaque fois exactement le même nom?

    Via le hash %files_tot tu peux vérifier

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    if((exist $file_to{chemin/toto.xls}) && (exist $file_to{chemin/tata.xls}) && (exist $file_to{chemin/tutu.xls})){
     
    }

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    132
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 132
    Par défaut
    sur les 3 fichiers,

    les 2 fichiers xls ont toujours le même nom

    le fichier text est estampillé d'une manière particulière

    $dateNow_$user_$application_partiedunomgénérique_$lastdayoflastyear_$datehier.txt
    il n'y a donc qu'une partie du nom de fichier qui ne change jamais

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

    Informations professionnelles :
    Activité : Bioinformaticienne
    Secteur : Santé

    Informations forums :
    Inscription : Octobre 2006
    Messages : 3 157
    Par défaut
    Voici l'idée que je suivrais. Il doit y avoir moyen de l'améliorer.

    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
    foreach my $rep (@repertoires){
     
        opendir (DH, $rep) or die "Cannot open $rep";
        my %h_file;
        map{$h_file{$_}=1;} grep {$_ !~ /^\.\.?/} readdir DH;
        my @text_file;
        @text_file = grep {$_ =~ /.txt$/} readdir DH;
     
        my ($dateNow, $user, $application, $lastdayoflastyear, $datehier);
        my $ok = 0;
        if((exist $h_file{$rep.'/toto.xls'}) && (exist $h_file{$rep.'/tata.xls'})){
            foreach my $txt (@text_file){
                if ($txt =~ /(\d+)_(\w+)_(\w+)_partiedunomgénérique_(\d+)_(\d+).txt/){
                    # les 3 fichiers sont présents
                    ($dateNow, $user, $application, $lastdayoflastyear, $datehier) = ($1, $2, $3, $4, $5);
                    $ok = 1;
                }
            }
        }
        if ($ok == 0){
            # si l'un des fichier est absent, seule la date et le nom de la personne doivent être récupérés
        }
     
        closedir (DH);
    }

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    132
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 132
    Par défaut si je comprends
    j'ai commenté ton code tels que je pense le comprendre car je n'ai pas forcément la compréhension de tout

    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
     
    foreach my $rep (@repertoires){
    # pour chaque répertoire présent dans ma liste
     
        opendir (DH, $rep) or die "Cannot open $rep";
    # ouvre le dossier ou échec
     
        my %h_file;
    #le % correspond au hash?
     
        map{$h_file{$_}=1;} grep {$_ !~ /^\.\.?/} readdir DH;
    #lecture des fichier dans l'arborescence cible
     
        my @text_file;
        @text_file = grep {$_ =~ /.txt$/} readdir DH;
    #présence du fichier texte
     
        my ($dateNow, $caisse, $application, $lastdayoflastyear, $datehier);
    # définition des variables qui constituent le nom du fichier texte
     
        my $ok = 0;
    # mise à zéro du test ok
     
        if((exist $h_file{$rep.'/toto.xls'}) && (exist $h_file{$rep.'/tata.xls'})){
    #si les 2 fichiers sont présents
     
            foreach my $txt (@text_file){
    #pour chaque fichier texte récupère les infos
     
                if ($txt =~ /(\d+)_(\w+)_(\w+)_PLUPD_(\d+)_(\d+).txt/){
    	#if($txt =~ /(\d+)_SUMMIT_(\w+)_PLUPD_(\d+)_(\d+).txt/){
    	# si le fichier texte est présent alors récupère les infos
                    # les 3 fichiers sont présents
                    ($dateNow, $caisse, $application, $lastdayoflastyear, $datehier) = ($1, $2, $3, $4, $5);
                    $ok = 1;
                }
            }
        }
        if ($ok == 0){
            # si l'un des fichier est absent, seule la date et le nom de la personne doivent être récupérés
        }
     
        closedir (DH);
    # fermeture du dossier
    }
    que penses tu ensuite de mon code pour récupérer les infos que ton code attrapent et place dans un fichier plat

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    my $db = 'DBI:oracle:basededonnées:adresseip';
    my $user = '';
    my $pass = '';
    my $dbh = DBI->connect($db, $user, $pass) 
      or die "connexion impossible";
     
    my $req = $dbh->prepare("INSERT INTO INF_F_PUB_INTRANET VALUES(?, ?, ?, ?, ?)");
     $req->execute( $Date, $Caisse, $NomFichier, $DateFichier, $HeureFichier )or die "requete impossible";
    merci

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

    Informations professionnelles :
    Activité : Bioinformaticienne
    Secteur : Santé

    Informations forums :
    Inscription : Octobre 2006
    Messages : 3 157
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
        my %h_file;
    #le % correspond au hash?
    N'as-tu pas honte de ce genre de question?


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
        my @text_file;
        @text_file = grep {$_ =~ /.txt$/} readdir DH;
    #présence du fichier texte
    Tu places tous les fichiers textes dans @text_file et ensuite via l'expreg tu vérifies la présence de celui que tu veux.


    Pour la DB
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    my $req = $dbh->prepare("INSERT INTO INF_F_PUB_INTRANET VALUES('$Date', '$Caisse', '$NomFichier', '$DateFichier', '$HeureFichier')");
    $req->execute()or die "requete impossible";
     
    ...
     
    $dbh->disconnect();

Discussions similaires

  1. récupération infos fichier ws depuis AS/400
    Par waste dans le forum AS/400
    Réponses: 2
    Dernier message: 27/06/2012, 18h30
  2. récupérations infos fichiers
    Par Baldric de Dol dans le forum Programmation et administration système
    Réponses: 23
    Dernier message: 19/08/2008, 16h19
  3. récupérations infos fichier plat vers BDD
    Par Baldric de Dol dans le forum SGBD
    Réponses: 3
    Dernier message: 08/08/2008, 22h16
  4. Récupération de fichiers par Access 2003
    Par JEAN MICHEL BOYER dans le forum Access
    Réponses: 3
    Dernier message: 02/09/2005, 18h18
  5. [ SWT ] Récupération info d'un Browse
    Par geegee dans le forum SWT/JFace
    Réponses: 11
    Dernier message: 08/06/2004, 16h23

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