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 :

Insérer une ligne entre deux autres dans un fichier


Sujet :

Langage Perl

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Février 2010
    Messages
    23
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2010
    Messages : 23
    Points : 8
    Points
    8
    Par défaut Insérer une ligne entre deux autres dans un fichier
    Bonjour,

    Je souhaiterais savoir quelle(s) commande(s) en PERL permet(tent) d'insérer une ligne dans un fichier entre deux lignes (entre les lignes 3 et 4 par exemple).

    Merci d'avance.

  2. #2
    Membre actif
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    221
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2010
    Messages : 221
    Points : 207
    Points
    207
    Par défaut
    Ajouter une ligne dans un fichier ne fait pas spécialement partie des attributions de perl et de ce fait, par défaut ce n'est pas forcément très simple.

    La première méthode consiste à lire le fichier et de le réécrire avec les modifications dans un autre fichier.

    une autre méthode consiste à utiliser le module Tie::File qui permet d'accéder aux ligne d'un fichier via un tableau.

  3. #3
    Futur Membre du Club
    Profil pro
    Inscrit en
    Février 2010
    Messages
    23
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2010
    Messages : 23
    Points : 8
    Points
    8
    Par défaut
    D'accord merci mais il ne serait pas possible sinon de chercher la position de la ligne suite à laquelle on souhaite ajouter une ligne (la ligne 2 si on souhaite ajouter une ligne entre les lignes 2 et 3 par exemple) et de la remplacer par elle-même avec un ou deux sauts de lignes pour ensuite faire un "print" de la ligne que l'on souhaite ajouter en y indiquant la position où on veut ajouter la ligne.

    Ainsi la ligne 3 se retrouverait à la ligne 4 et on ferait un "print" en indiquant dans cette commande que l'on souhaite ajouter la ligne dans la ligne 3 (je ne sais pas si c'est clair ...).

    Et sinon ca se passerait comment avec Tie::File?

  4. #4
    Membre actif
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    221
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2010
    Messages : 221
    Points : 207
    Points
    207
    Par défaut
    Salut,

    Par défaut perl sais lire un fichier, mais pas le modifier directement en ligne.
    d'où le lire, puis le réécrire dans un autre fichier.

    Le module Tie::file, lui le permet.
    Le principe avec ce module c'est qu'il "voit" le fichier en tant que tableau. Chaque ligne du fichier correspond à une entrée dans le tableau

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    use Tie::File;
     
    tie @array, 'Tie::File', filename or die ...;
     
    array[13] = 'blah';     # line 13 of the file is now 'blah'
    print $array[42];       # display line 42 of the file
    Tu manipules un tableau mais en fait c'est le fichier lui même
    voilà le lien de la doc Cpan du module:

    http://search.cpan.org/~mjd/Tie-File...ib/Tie/File.pm

    Voici un exemple d'insertion entre 2 lignes:


    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
    #!/usr/bin/perl
     
    use Tie::File;
    use strict;
    use warnings;
     
    my $filename = "tiefileinput.txt";
    my @array;
     
    #ouverture du fichier
    tie @array, 'Tie::File', $filename or die print "error: while opening $filename\n";
     
    # Affichage du fichier
    for (my $i=0; $i<scalar(@array); $i++)
    {
    	print $array[$i]."\n";
    }
     
    # insertion d'une ligne entre la ligne 2 et 3
    splice @array, 2, 0, 'Coooool';
     
    # Affichage du fichier
    for (my $i=0; $i<scalar(@array); $i++)
    {
    	print $array[$i]."\n";
    }
     
    # Fermeture du fichier
    untie @array;

  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 : 498 771
    Points
    498 771

  6. #6
    Membre confirmé
    Avatar de Schmorgluck
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    371
    Détails du profil
    Informations personnelles :
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Mai 2006
    Messages : 371
    Points : 558
    Points
    558
    Par défaut
    Pour le fun, un one-liner qui ajoute une ligne contenant "toto" entre la troisième et la quatrième ligne du fichier en entrée.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    perl -lpe'print "toto" if $.==4' fichier_en_entrée
    D'accord, il ne touche pas au fichier d'origine, et ne fait que produire le texte modifié, mais il suffit d'ajouter une option de ligne de commande pour qu'il le fasse. Ce qui n'est à faire qu'avec une extrême prudence. J'insiste. Je me sers des one-liners tous les jours, je me considère comme plutôt calé en la matière, mais je n'ai pas utilisé cette option depuis près de trois ans. Et c'est pourquoi je ne précise pas l'option en question : elle sert de toute façon rarement, et j'estime préférable de laisser à un novice le temps de réfléchir et de se renseigner en la cherchant dans la documentation.

  7. #7
    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 : 58
    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
    Points : 5 753
    Points
    5 753
    Par défaut
    @djibril: n'oublie pas d'ajouter cet uniligne ici, si schmorgluck est d'accord : http://perl.developpez.com/sources/?...lignes-fichier

  8. #8
    Membre confirmé
    Avatar de Schmorgluck
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    371
    Détails du profil
    Informations personnelles :
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Mai 2006
    Messages : 371
    Points : 558
    Points
    558
    Par défaut
    Je l'aurais bien proposé moi-même, mais je ne pensais pas qu'il serait intéressant.

  9. #9
    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 : 498 771
    Points
    498 771
    Par défaut
    @Philou67430 : pas de soucis.
    @Schmorgluck : Mets-nous un exemple plus propre qui modifie le fichier original, vu que c'est le but premier. Met le ici. N'hésite pas de rajouter l'option -pi.bak pour une éventuelle sauvegarde du fichier original.

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

Discussions similaires

  1. Insérer une ligne entre deux lignes
    Par lecroquant dans le forum Débuter
    Réponses: 6
    Dernier message: 01/10/2010, 12h17
  2. Réponses: 4
    Dernier message: 21/07/2010, 16h18
  3. Tracer une ligne entre deux DIV
    Par akrogames dans le forum jQuery
    Réponses: 1
    Dernier message: 04/05/2009, 20h29
  4. [Dojo] Tracer une ligne entre deux DIV
    Par Invité dans le forum Bibliothèques & Frameworks
    Réponses: 1
    Dernier message: 04/03/2009, 00h54
  5. REGEXP : recupérer une chaine entre deux autres chaines
    Par dude666 dans le forum Collection et Stream
    Réponses: 2
    Dernier message: 31/08/2006, 09h23

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