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] PERL :fichier saisi en variable ?


Sujet :

Langage Perl

  1. #1
    Membre averti
    Inscrit en
    Janvier 2007
    Messages
    24
    Détails du profil
    Informations forums :
    Inscription : Janvier 2007
    Messages : 24
    Par défaut [débutant] PERL :fichier saisi en variable ?
    Bonjour,
    je cherche à supprimer la 1ère ligne de plusieurs fichiers txt !
    voici mon programme test qui marche bien pour un fichier déterminé : "test.txt"
    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
    #!/usr/bin/perl -w                       
     
    open(FILE, "< test.txt" )
    or die ("prob a l'ouverture du fichier" );
    @save = <FILE>;
        close(FILE);
       foreach (@save)
    {
       $_ = "" if ($_ =~ m/AMR/);
       chomp $_;
     }
     open(FILE, ">test.txt" )
         or die ("prob a l'ouverture du fichier" );
     foreach (@save)
    {
        print FILE $_."\n" if ($_);
    }
     close(FILE);
    j'aimerais pouvoir utiliser mon programme pour plusieurs fichiers à la fois c'est à dire qu'au lieu de lancer le script n fois pour les n fichiers je voudrais pouvoir taper un commande du style test.pl * qui me permettrait de traiter tous les fichiers de mon répertoire. Les fichiers de sorties doivent avoir le même nom que les fichiers d'entrée
    Si vous pouviez me donner un coup de main ce serait sympa

    merci BEAUCOUP

  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
    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/local/bin/perl
     
    use strict;
    use FileHandle;
     
     
    my @files = qw(fich1 fich2 fich3 fich4 fich5); # chemin complet ex: P:/Perl/scripts/Files/Test.txt
    # ou récupération de tous les fichiers du répertoire portant l'extension .txt
    my @files = glob('P:/Perl/scripts/Files/*.txt');
     
    @files = qw(P:/Perl/scripts/Files/Test.txt);
     
    foreach my $file (@files){
     
        open(FILE, "< $file" )
        or die ("prob a l'ouverture du fichier $file\n" );
     
        my ($path, $name) = ($file =~ /(.*)\/(\w+\.txt)/);
        my $out_file = FileHandle->new (">".$path."/temp_".$name);
     
        my $line;
        while ($line = <FILE>){
            if ($. > 1){   # pour toutes les lignes sauf la première
                if ($line =~ m/ARM/){
                    print $out_file  "\n";  # un saut de ligne 
                }
                else{
                    print $out_file $line;
                }
            }
        }
        close(FILE);
     
        unlink ($file);   # destruction du fichier d'entrée
        if(-e $file){print "OK";} # problème car le fichier existe toujours et donc on ne peut pas renommer le fichier provisoire
        rename ($path."temp_".$name, $file);    # on renomme le fichier traité avec le nom du fichier d'entrée
    }
    J'ai écrit ce script comme si tous tes fichiers avaient l'extension .txt

    Il y a un problème pour renommer car le unlink semble se faire après le rename. J'ai essayé avec un sleep(5) mais sans succès.

    PS : fais un backup de tes fichiers ou fais des tests afin de vérifier que ce script fait ce que tu veux. Ne va pas supprimer tes bons fichiers. Tu peux d'ailleurs dans un premier temps mettre en commentaire la ligne unlink ($file);

  3. #3
    Expert confirmé
    Avatar de Jedai
    Homme Profil pro
    Enseignant
    Inscrit en
    Avril 2003
    Messages
    6 245
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Avril 2003
    Messages : 6 245
    Par défaut
    Voyons :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    perl -i.bak -ne 'next if $. == 1; if( m/ARM/ ) { print "\n" } else { print }' *.txt
    Fait ce que tu demandes (avec des backups en .bak).

    Sinon, si tu veux faire des modifications en place de fichiers, n'oublie pas de consulter la question de la FAQ qui y est consacré, elle répertorie les méthodes et offre du code, la méthode 2 devrait te convenir.

    --
    Jedaï

  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
    C'est génial, ça tient en une seule ligne. Cela fonctionne t'il également pour Windows?

    Que contient *.txt? le chemin d'un seul fichier?
    Il a-t'il moyen de donner un répertoire en entrée et que tous ses fichiers soient traités?

  5. #5
    Expert confirmé
    Avatar de Jedai
    Homme Profil pro
    Enseignant
    Inscrit en
    Avril 2003
    Messages
    6 245
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Avril 2003
    Messages : 6 245
    Par défaut
    Citation Envoyé par Jasmine80 Voir le message
    C'est génial, ça tient en une seule ligne. Cela fonctionne t'il également pour Windows?
    Oui, mais pour le shell de windows, il faut modifier un peu les quotes :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    perl -i.bak -ne "next if $. == 1; if( m/ARM/ ) { print qq(\n) } else { print }" *.txt
    Citation Envoyé par Jasmine80 Voir le message
    Que contient *.txt? le chemin d'un seul fichier?
    Il a-t'il moyen de donner un répertoire en entrée et que tous ses fichiers soient traités?
    *.txt doit être transformé par le shell en une liste de fichier .txt (comme glob en Perl). Pour donner un répertoire tu utilises répertoire/*, par exemple.

    --
    Jedaï

  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
    Merci beaucoup pour les informations, j'en apprends tous les jours sur ce forum.

  7. #7
    Membre averti
    Inscrit en
    Janvier 2007
    Messages
    24
    Détails du profil
    Informations forums :
    Inscription : Janvier 2007
    Messages : 24
    Par défaut
    Salut,
    merci pour vos réponses...j'ai essayé de m'en inspirer avec également l'aide dela FAQ mais ça coince encore !!
    Ca marche toujours nickel pour un fichier mais pour un ensemble de fichiers d'un répertoire ben ça coince !!
    J'ai un message d'erreur qui dit : problème à l'ouverture du fichier .
    C'est quoi ce "."
    En faisant un dir sous dos je constate que j'ai deux éléments non identifié : "." et ".." à quoi seervent ils ?? grr je suis sure que j'y suis presque pourtant !!
    voici mon 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
    #!/usr/bin/perl
     
    use warnings;
    use strict;
    use Carp;
     
     
     
     
    my ($fichier_initial, $dossier) = (undef, 'C:/Documents and Settings/plleno/bureau/test2');
     
    opendir (my $dir, $dossier) or die "$dossier n'existe pas !";
     
    my @files = readdir $dir;
     
    foreach $fichier_initial (@files) 
     
    {
     
    open (LECTURE,"< $fichier_initial") or die ("pb d'ouverture du fichier $fichier_initial"); 
     
      open (ECRITURE, ">$fichier_initial" ) or die ("pb d'ecriture dans le fichier $fichier_initial");
     
    my $ligne; 
     while ($ligne = <LECTURE>){
     
    if ($. > 1)
    {  
                if ($ligne =~ m/AMR/){
     
                    print ECRITURE  "\n";   
                }
                else{
                    print ECRITURE $ligne;
                }
      }
     
      close (LECTURE);
      close (ECRITURE);}
    }
    autre chose je ne suis pas sur que mettre fichier inital dans mon entrée et dans ma sortie fonctionne ...en fait je suis sur que c'est une bétise !
    du coup j'aimerais écrire en sorti sur un fichier du type "fichier_initial.bak" même si ce n'est pas vraiment le backup mais bon c'est pour aller plus vite !!
    J'ai essayé une syntaxe du type OPEN (ECRITURE, ">$fichier_initial.".bak""
    mais je ne suis pas sure que ça marche comme ça !!
    Sinon en suivant à la lettre la methode 2 de la FAQ j'arrive à cela
    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
    #!/usr/bin/perl
    use strict;
    use warnings;
    use File::Copy;
    use File::Temp;
     
    my ($fh_temp, $file_temp) = tempfile( "fichier_temporaireXXXX", UNLINK => 1);
     
     
    my ($fichier_initial, $dossier) = (undef, 'C:/Documents and Settings/plleno/bureau/test2');
     
    opendir (my $dir, $dossier) or die "$dossier n'existe pas !";
     
    my @files = readdir $dir;
     
    foreach $fichier_initial (@files) 
     
    {
    open (LECTURE,"< $fichier_initial") or die ("pb d'ouverture du fichier $fichier_initial"); 
     
    while(my $ligne = <LECTURE>) {
     
     
    $_ = "" if ($_ =~ m/AMR/);
    chomp $_;
     
    if ($_)
    {
     print {$fh_temp} "$_.\n";}
    }
    close($fh_temp);
    close($fichier_initial);
     
    copy($file_temp,$fichier_initial);
    }
    mais là j'ai pas le module qu'il faut, ça me met un message d'erreur du style :undefined subroutine &main::tempfile......

    Je crois que je n'y arriverai pas de sitôt !!!
    Pouvez me donnez encore un ti coup de pouce svp !
    merci

  8. #8
    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
    Citation Envoyé par Jedai Voir le message
    Voyons :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    perl -i.bak -ne 'next if $. == 1; if( m/ARM/ ) { print "\n" } else { print }' *.txt
    Fait ce que tu demandes (avec des backups en .bak).

    Sinon, si tu veux faire des modifications en place de fichiers, n'oublie pas de consulter la question de la FAQ qui y est consacré, elle répertorie les méthodes et offre du code, la méthode 2 devrait te convenir.

    --
    Jedaï
    Pourquoi ne fais-tu pas ainsi?


    Pour ton code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    my ($fichier_initial, $dossier) = (undef, 'C:/Documents and Settings/plleno/bureau/test2');
     
    opendir (my $dir, $dossier) or die "$dossier n'existe pas !";
     
    my @files = readdir $dir;
     
    foreach $fichier_initial (@files) 
     
    {
    Je ferais
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    my $dossier = 'C:/Documents and Settings/plleno/bureau/test2';
    opendir (REP, $dossier) or die "$dossier n'existe pas !";
    my @files = readdir (REP);
    closedir (REP);
     
    foreach my $fichier_initial (@files){
    ...
    ou encore plus simple (il faut modifier la fin de cette expression en fonction des fichiers que tu veux récupérer)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    my @files = glob('C:/Documents and Settings/plleno/bureau/test2/*.txt');

    J'ai un message d'erreur qui dit : problème à l'ouverture du fichier .
    C'est quoi ce "."
    En faisant un dir sous dos je constate que j'ai deux éléments non identifié : "." et ".." à quoi seervent ils ?? grr je suis sure que j'y suis presque pourtant !!
    J'avais eu le même problème dans
    http://www.developpez.net/forums/sho...d.php?t=526211

    Voila le truc de Jedai
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    my @file_rep = grep { !/^\.\.?$/ } readdir(REP);
    Tu pourrais donc essayer quelque chose du genre
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    my @files_rep = glob('C:/Documents and Settings/plleno/bureau/test2/*');
    my @files = grep { !/^\.\.?$/ }@files_rep;
    foreach my $fichier_initial (@files){
    ...
    ou
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    my $dossier = 'C:/Documents and Settings/plleno/bureau/test2';
    opendir (REP, $dossier) or die "$dossier n'existe pas !";
    my @files = grep { !/^\.\.?$/ } readdir (REP);
    closedir (REP)

  9. #9
    Membre expérimenté Avatar de CKLN00
    Homme Profil pro
    Bioinformaticien Java/Perl
    Inscrit en
    Avril 2008
    Messages
    210
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Vienne (Poitou Charente)

    Informations professionnelles :
    Activité : Bioinformaticien Java/Perl
    Secteur : Santé

    Informations forums :
    Inscription : Avril 2008
    Messages : 210
    Par défaut
    moi pour éviter 'les fichiers' . et .. (qui sont en fait des lien symbolique vers le dossier parent et vers le dossier en cours) je faisait un
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    next if ($file eq '.' or $file eq '..')
    au tout début de mon foreach

  10. #10
    Membre averti
    Inscrit en
    Janvier 2007
    Messages
    24
    Détails du profil
    Informations forums :
    Inscription : Janvier 2007
    Messages : 24
    Par défaut
    Citation Envoyé par Jasmine80 Voir le message
    Pourquoi ne fais-tu pas ainsi?

    Euh parce que je ne vois pas trop comment faire avec une liste de fichiers ....en une seule ligne !

    Bmerci bien je teste tout ça et je vous dis ça

Discussions similaires

  1. Réponses: 1
    Dernier message: 18/09/2013, 00h08
  2. Réponses: 3
    Dernier message: 28/05/2009, 15h27
  3. Débutant Perl question fichier
    Par maestro1303 dans le forum Langage
    Réponses: 12
    Dernier message: 07/10/2008, 13h15
  4. Réponses: 2
    Dernier message: 11/06/2008, 22h37
  5. [débutant]Perl lire un fichier texte
    Par Ralfman68 dans le forum Langage
    Réponses: 5
    Dernier message: 06/06/2007, 20h28

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