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 :

Problème lecture fichier dans une arborescence de dossiers


Sujet :

Langage Perl

  1. #1
    Membre régulier
    Inscrit en
    Mars 2010
    Messages
    157
    Détails du profil
    Informations forums :
    Inscription : Mars 2010
    Messages : 157
    Points : 80
    Points
    80
    Par défaut Problème lecture fichier dans une arborescence de dossiers
    Bonsoir à tous

    J'ai trouvé un programme sur ce forum qui permet de lire tous les fichiers qui existe dans un dossier, qui peut lui aussi contenir d'autre dossier, donc ce programme il permet de liste les fichiers et ca marche correctoment

    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
    #!/usr/bin/perl
     
     
    sub GetFilesList
    {
            my $Path = $_[0];
            my $FileFound;
            my @FilesList=();
     
            # Lecture de la liste des fichiers
            opendir (my $FhRep, $Path)
                    or die "Impossible d'ouvrir le repertoire $Path\n";
            my @Contenu = grep { !/^\.\.?$/ } readdir($FhRep);
            closedir ($FhRep);
     
            foreach my $FileFound (@Contenu) {
                    # Traitement des fichiers
                    if ( -f "$Path/$FileFound") {
                            push ( @FilesList, "$Path/$FileFound" );
                    }
                    # Traitement des repertoires
                    elsif ( -d "$Path/$FileFound") {
                            # Boucle pour lancer la recherche en mode recursif
                            push (@FilesList, GetFilesList("$Path/$FileFound") );
                    }
     
            }
            return @FilesList;
    }
     
    #
    # Boucle principale
    #
    my @Files = GetFilesList ("C:/multilingue/la2");
    foreach my $File  (@Files) {
    	print "$File\n";
     
     
    }
    Le problème c'est quand je veux lire le contenu du fichier ca ne marche pas

    j'ai ajouter ce code dans la dernière boucle
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    my @Files = GetFilesList ("C:/multilingue/la2");
    foreach my $File  (@Files) {
    	print "$File\n";
     
     
    $l="${File}";
    	open(FIC, ">$l");
     
    while (<FIC>) {
    my $ligne=$_;
    chomp($ligne);
    print "$ligne";
    }
    }
    Donc mon problème c'est que j'arrive pas à lire le contenu des fichiers

    Merci pour 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
    Pourquoi fais-tu ceci?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    $l="${File}";
    	open(FIC, ">$l");
    Déjà, tu ouvres tes fichiers en écriture (c'est la principale erreur), ce qui va avoir pour effet d'écraser leur contenu. Ensuite, tu n'as pas besoin de la nouvelle variable $l, ouvre directement $file, et puis tu devrais utiliser la syntaxe à trois arguments de open et vérifier si l'ouverture a fonctionné. Je te conseille de plus d'utiliser un file handle lexical.

    En mettant tout ce qui précède ensemble, je te conseille de remplacer ces deux lignes par:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    open my $FIC, "<", $File or die "ouverture impossible de $File $!";
    Et bien sûr de modifier le while pour utiliser le file handle lexical:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    while (<$FIC>) { # ...
    Si tu ouvres ton fichier uniquement pour ensuite imprimer les lignes, alors ne fais pas de chomp sur tes lignes, sinon ton fichier s'imprimera comme une longue ligne interminable.

    Je te conseille aussi de toujours avoir les deux pragmas suivants au début de tes programmes:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    use strict;
    use warnings;
    Avec cela, le compilateur te préviendra de nombreuses erreurs ou constructions dangereuses ou douteuses.

  3. #3
    Membre régulier
    Inscrit en
    Mars 2010
    Messages
    157
    Détails du profil
    Informations forums :
    Inscription : Mars 2010
    Messages : 157
    Points : 80
    Points
    80
    Par défaut
    Merci pour votre réponse
    J'ai fait les changements, mais ca ne change rien
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    foreach my $File  (@Files) {
    	print "$File\n";
     
     
     
    open my $FIC, "<", $File or die "ouverture impossible de $File $!";
     
    while (<$FIC>) {
    my $ligne=$_;
     
    print "$ligne";
    }
    }

  4. #4
    Membre chevronné Avatar de dmganges
    Homme Profil pro
    Retraité. Ne recherche pas un emploi.
    Inscrit en
    Septembre 2011
    Messages
    1 392
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 71
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Retraité. Ne recherche pas un emploi.
    Secteur : Service public

    Informations forums :
    Inscription : Septembre 2011
    Messages : 1 392
    Points : 2 044
    Points
    2 044
    Par défaut
    Bonjour,

    Citation Envoyé par africanwinners
    J'ai fait les changements, mais ca ne change rien
    Ça doit au moins donner un code erreur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    E:\_DEV\_Essais>perl africanwinners.pl
    
    Impossible d'ouvrir le repertoire E:_DEV_Essais
    
    E:\_DEV\_Essais>
    Et dans ce cas tu remarques qu'il manque les slashs dans le nom du répertoire, donc :

    soit : 'E:\_DEV\_Essais'
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    #
    # Boucle principale
    #
    my @Files = GetFilesList ('E:\_DEV\_Essais');
    foreach my $File  (@Files) {
    	print "===>$File\n";
    	open my $FIC, "<:utf8", $File or die "ouverture impossible de $File $!";
    	while (<$FIC>) {
    		my $ligne=$_;
    		print "$ligne";
    	}
    	print "\n\n";
    }
    soit : "E:\\_DEV\\_Essais"
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    #
    # Boucle principale
    #
    my @Files = GetFilesList ("E:\\_DEV\\_Essais");
    foreach my $File  (@Files) {
    	print "===>$File\n";
    	open my $FIC, "<:utf8", $File or die "ouverture impossible de $File $!";
    	while (<$FIC>) {
    		my $ligne=$_;
    		print "$ligne";
    	}
    	print "\n\n";
    }
    NB : en indentant correctement, c'est quand même plus lisible...

    Citation Envoyé par résultat
    ...
    ...
    ===>E:\_DEV\_Essais/Fichier_1.txt
    TATA
    TOTO
    TITI
    éclair

    ===>E:\_DEV\_Essais/ifr38.pl
    #!/usr/bin/perl
    use strict;
    use warnings;
    use utf8;
    use XML:arser;
    ...
    ...
    africanwinners.pl (testé)
    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
    #!/usr/bin/perl
    use strict;
    use warnings;
    use utf8;
     
    ActiverAccents();
     
    #
    # Boucle principale
    #
    my @Files = GetFilesList ("E:\\_DEV\\_Essais");
    foreach my $File  (@Files) {
    	print "===>$File\n";
    	open my $FIC, "<:utf8", $File or die "ouverture impossible de $File $!";
    	while (<$FIC>) {
    		my $ligne=$_;
    		print "$ligne";
    	}
    	print "\n\n";
    }
     
    sub GetFilesList
    {
            my $Path = $_[0];
            my $FileFound;
            my @FilesList=();
     
            # Lecture de la liste des fichiers
            opendir (my $FhRep, $Path)
                    or die "Impossible d'ouvrir le repertoire $Path\n";
            my @Contenu = grep { !/^\.\.?$/ } readdir($FhRep);
            closedir ($FhRep);
     
            foreach my $FileFound (@Contenu) {
                    # Traitement des fichiers
                    if ( -f "$Path/$FileFound") {
                            push ( @FilesList, "$Path/$FileFound" );
                    }
                    # Traitement des repertoires
                    elsif ( -d "$Path/$FileFound") {
                            # Boucle pour lancer la recherche en mode recursif
                            push (@FilesList, GetFilesList("$Path/$FileFound") );
                    }
     
            }
            return @FilesList;
    }
     
    #==============================================================
    # Pour avoir les accents sur la console DOS
    # http://perl.developpez.com/faq/perl/?page=Terminal#AccentsDOS
    #==============================================================
    sub ActiverAccents {
    	my $encodage;
    	# Windows
      	if ( lc($^O ) eq 'mswin32') {
    		eval {
    			my ($codepage) = ( `chcp` =~ m/:\s+(\d+)/ );
    			$encodage = "cp$codepage";
    			foreach my $h ( \*STDOUT, \*STDERR, \*STDIN, ) {
    				binmode $h, ":encoding($encodage)";
    			}
    		};	
    	}
    	else {
    		$encodage = `locale charmap`;
    		eval {
    			foreach my $h ( \*STDOUT, \*STDERR, \*STDIN, ) {
    				binmode $h, ":encoding($encodage)";
    			}
    		};	
    	}
      return $encodage;
    }
     
    #Sinon :
    #ü 	\x81 	à 	\x85 	è 	\x8A
    #é 	\x82 	ç 	\x87 	ï 	\x8B
    #â 	\x83 	ê 	\x88 	î 	\x8C
    #ä 	\x84 	ë 	\x89

  5. #5
    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
    Le problème n'est assurément pas dans le dernier bout de code que tu as posté. Poste ton code en entier et poste les éventuels messages d'erreur.

  6. #6
    Membre régulier
    Inscrit en
    Mars 2010
    Messages
    157
    Détails du profil
    Informations forums :
    Inscription : Mars 2010
    Messages : 157
    Points : 80
    Points
    80
    Par défaut
    Citation Envoyé par Lolo78 Voir le message
    Le problème n'est assurément pas dans le dernier bout de code que tu as posté. Poste ton code en entier et poste les éventuels messages d'erreur.
    Bonjour à tous, c'est résolu juste en ajoutant le anti slash "\" dans le chemin du dossier merci à vous tous

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

Discussions similaires

  1. Réponses: 26
    Dernier message: 26/03/2010, 15h24
  2. Compter le nombre de fichiers dans une arborescence
    Par Olivier Regnier dans le forum Shell et commandes GNU
    Réponses: 9
    Dernier message: 22/08/2007, 10h29
  3. Récupération de fichiers dans une arborescence
    Par bibilolo2 dans le forum Shell et commandes GNU
    Réponses: 4
    Dernier message: 04/05/2007, 22h19
  4. chercher un fichier dans une arborescence
    Par diamonds dans le forum Entrée/Sortie
    Réponses: 15
    Dernier message: 16/03/2007, 14h27
  5. Récursivité dans une arborescence de dossiers...
    Par thony23 dans le forum Langage
    Réponses: 5
    Dernier message: 26/10/2005, 16h14

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