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 :

Lire répertoire et modifier un chaine de caractères


Sujet :

Langage Perl

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    43
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Novembre 2006
    Messages : 43
    Par défaut Lire répertoire et modifier un chaine de caractères
    Bonjour,

    Comment faire en Perl sous windows pour lire un répertoire et modifier une chaine de caractère à l'intérieur des fichiers.

    Exemple: J'ai un répertoire qui contient 12 fichiers .txt et je voudrais changer une chaine de caractère dans les 12 fichiers. Exemple: remplacer toto (ici faire attention car il y a un espace à la fin de toto) par toto_

    J'ai fouiller un peu partout mais je ne trouve pas exactement ce que je veux faire.

    Merci de me venir en 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
    Billets dans le blog
    1
    Par défaut
    Bonjour,

    une esquisse de solution.

    Dans ton programme Perl, tu crées un tableau contenant le nom des fichiers de ton répertoire:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    my @liste_fichiers = glob ("*.txt");
    Ensuite, tu ouvres et lis chaque fichier individuellement:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    foreach my $fichier (@liste_fichiers) {
         open FILE_IN, "<", $fichier or die "impossible d'ouvrir le fichier $fichier $! \n";
         while (<FILE_IN>) {
              s/toto /toto_/g;
              print;
         }
         close FILE_IN;
    }
    Ici, je me suis contenté d'afficher les lignes modifiées à l'écran, ça te donne un début de solution.

    On ne peut d'une façon générale pas modifier un fichier. Il faut créer une copie avec un autre nom, puis renommer.

    Si tu veux mettre le résultat dans des fichiers, il te faudra ouvrir des fichiers en sortie (avec un nom différent du fichier en entrée), puis s'occuper du renommage.

    Sinon, on peut aussi faire un uniligne qui gère tout plus facilement, mais là, je n'ai pas trop le temps.

  3. #3
    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
    Billets dans le blog
    1
    Par défaut
    La solution uniligne, fichier par fichier:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    perl -pi -e 's/toto /toto_/g;' toto.txt
    Sous Unix, Linux ou VMS, on peut même traiter l'ensemble des fichiers d'un répertoire d'un seul coup, par exemple:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    perl -pi -e 's/toto /toto_/g;' *.txt
    va modifier tous les fichiers *.txt selon le besoin.

    Cet exemple modifie les fichiers "en place", c'est-à-dire que les fichiers sont effectivement modifiés. Pas besoin de créer des fichiers temporaires.

    Cela ne marche pas sous Windows (qui n’interprète pas "*.txt" sous la forme d'une liste de fichier à modifier), mais Alek-C a fourni récemment une solution simple et efficace à ce genre de problème sous Windows:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    FOR %A IN (*.txt) DO perl -pi.bak -e "s/toto /toto_/g;"

  4. #4
    Expert confirmé

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2009
    Messages
    3 577
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 59
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Avril 2009
    Messages : 3 577
    Par défaut
    Citation Envoyé par Lolo78 Voir le message
    Sous Unix, Linux ou VMS, on peut même traiter l'ensemble des fichiers d'un répertoire d'un seul coup, par exemple:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    perl -pi -e 's/toto /toto_/g;' *.txt
    Également fonctionnel sous Windows

  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
    Billets dans le blog
    1
    Par défaut
    Je suis surpris. J'ai essayé à la ligne de commande dans une fenêtre Dos il y a quelque temps, comme Dos n'interprête pas le "*.txt", pour moi ça ne marche pas (d'où la boucle script Dos proposée). Cela dit, je n'ai pas une installation normale de Perl sous Windows, juste l'exécutable et la DLL, installés en bonus lors de l'installation d'un clienty Oracle.

    Si ça marche chez toi, j'aimerais savoir comment tu t'y prends. Je suis sûr que ça intéressera d'autres gens car il y a déjà eu des discussions ici sur cette question.

  6. #6
    Expert confirmé

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2009
    Messages
    3 577
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 59
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Avril 2009
    Messages : 3 577
    Par défaut
    Il me semble qu'on en avait discuté récemment dans un autre fil. J'avais alors testé deux solutions sur mon ancien PC de bureau sous XP. A présent sous 7, je vais retester avec l'invité de commande de ce nouveau système et Strawberry perl (sous XP, j'avais également testé ActivePerl).
    En tout cas, ceci fonctionne comme sous Unix en utilisant Cygwin (c'est ce que j'utilise principalement, vu qu'en plus de perl, j'hérite d'un vrai shell (bash), et de tous les outils Unix bien utiles, y compris sous Windows.

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

Discussions similaires

  1. modifier un chaine de caractère
    Par abdallah2007 dans le forum ASP.NET
    Réponses: 4
    Dernier message: 14/02/2008, 12h21
  2. Fonction qui modifie une chaine de caractère
    Par condor_01 dans le forum Débuter
    Réponses: 7
    Dernier message: 05/11/2007, 18h32
  3. modifier sous chaine de caractère d'un champs
    Par yanice dans le forum Requêtes
    Réponses: 7
    Dernier message: 15/05/2007, 18h01
  4. Modifier une chaine de caractères lue dans une DB
    Par shinryu69 dans le forum Langage
    Réponses: 4
    Dernier message: 31/10/2006, 13h40
  5. Modifier une chaine de caractères ?
    Par Arkadius dans le forum Oracle
    Réponses: 2
    Dernier message: 13/04/2006, 16h21

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