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 :

Mise en page fichier


Sujet :

Langage Perl

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    76
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 76
    Par défaut Mise en page fichier
    Bonjours a tous.
    Me revoila aprés des lectures des faq et cours sur les exprssions réguliére.

    J'ai toujours un fichier dns que je filtre avec la portion de code suivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    while($lines = <FICH>){
    #si la ligne est du type : '<;*** - 2 ou + espaces - chaîne de caractére - 1 ou + espaces - chaines de caractére>
    	if($lines =~ /;\*\*\*\s{2,}(.+)\s+(.+)/)
    	{
     
    		$adresse=$1;
                    $nom=$2;
    		#on retire les espaces et les ;***
    		print(FICHOUT "$adresse $nom\n");
    		$i++;
    	}
    J'obtient des lignes comme :
    172.18.1.x reseau federateur enseignement
    172.18.42.0 Gestion
    172.19.3.0 reserve DHCP pour vpn

    Je voudrais mettre en page ce fichier pour pouvoir rentrer plus facilement les informations dans une bdd , par exemple obtenir une mise en page comme :
    172.18.1.x;reseau federateur enseignement
    172.18.42.0;Gestion
    172.19.3.0;reserve DHCP pour vpn

    Je ne sait pas si je doit traiter cette mise en page aprés le print ou dans une autre boucle ?

    Mais aussi savoir si je doit regénérer un autre fichier résultat ou puis-je travailler en lecture et ecriture dans le même fichier ? ?

    Aussi j'aimerais savoir comment coder :
    si la ligne est : adresse --1 ou + espace -- nom la remplacer par adresse ;espace -- nom
    j'ai réalisé le code suivant:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    while($lines2 = <FICHOUT>){
    #si la ligne est du type : adresse --1 ou + espace -- nom 
    	if($lines2 =~ /(.+)\s{1,}(.+)/)
    	{
     
    		$lines =~ s/(.+)\s{1,}(.+)/(.+);(.+)/g; 
    	}
     
    }
    Mais cela n'affecte pas la mise en page de mon fichier si je place ce code a la suite de le première boucle.

    Merci de votre aide

  2. #2
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    88
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 88
    Par défaut
    Bonjour,

    Ton $i++ ne doit pas servir à grande chose dans ta boucle.

    Si tu veux avoir nom;adresse dans ton nouveau fichier, il faut juste faire.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
     
    print(FICHOUT "$adresse;$nom\n");
    Pour ta 2eme question. Je n'ai pas bien compris la forme de la ligne.

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    76
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 76
    Par défaut
    Merci de la rapidité de ta réponse j'avais pensé a faire un tel print mais le point virgule ne se retrouve pas a l'endroit ou je le souaiterais par exemple :
    172.16.x.x UBO IUEM de vient 172.16.x.x UBO;IUEM

    J'ais comprit que cela vient du
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if($lines =~ /;\*\*\*\s{2,}(.+)\s+(.+)/)
    qui "ratisse trop large". J'ai l'impression qui selectione "172.16.x.x UBO" au lieur de prendre que "172.16.x.x".

  4. #4
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    88
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 88
    Par défaut
    Pourquoi tu n'es pas resté avec cette ligne

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
     
    my $line = ";*** 172.21.X.X reseau1 truc trerer" ;
    $line =~ s/^;\*{3}\s+([\w\.]+)\s+(.+)\s*$/$1;$2/;
     
    print "$line" ;
     
    # Affiche :      172.21.X.X;reseau1 truc trerer

  5. #5
    Membre chevronné Avatar de iblis
    Inscrit en
    Janvier 2007
    Messages
    510
    Détails du profil
    Informations personnelles :
    Âge : 59

    Informations forums :
    Inscription : Janvier 2007
    Messages : 510
    Par défaut
    Bonjour.

    Apparemment, si j'ai bien compris ce que tu fais, tu peux simplement écrire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    print(FICHOUT "$adresse;$nom\n");
    Si tu as un autre traitement à faire sur les lignes que tu lis alors, oui, fais le dans la même boucle. Sinon tu peux faire tout tes traitements en mémoire d'abord, avec autant de boucle que tu veux, et écrire le résultat dans ton fichier de sortie à la fin.

  6. #6
    Membre chevronné Avatar de iblis
    Inscrit en
    Janvier 2007
    Messages
    510
    Détails du profil
    Informations personnelles :
    Âge : 59

    Informations forums :
    Inscription : Janvier 2007
    Messages : 510
    Par défaut
    Oupla, mon poste répète celui de aikinhdo, voilà ce que c'est de faire plusieurs choses en même temps

  7. #7
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    76
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 76
    Par défaut
    OK merci iblis.
    aikinhdo le i++ me sert a comptre le nombre de reseau trouvé dans le fichier dns.

    Je n'ais pas gardé la ligne que tu me montre car elle était trop restrictive et ne laisser passer que 39 reseau de mon ficher au lieu de 143 cela vient du fait que le fichier n'as pas été comenté avec éxactitude donc le nombre d'espace n'ais pas fixe

    J'ai réglé mon probléme de filtre en rajoutant un " ? " .
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if($lines =~ /;\*\*\*\s{2,}(.+?)\s+(.+)/)
    Mon probléme est maintenant résolue en reréglant le filtre et avec un simple print cela passe.
    Je met mon code si jamais ca peut intéresser quelqu'un :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    $i=0;
    while($lines = <FICH>){
    #si la ligne est du type : '<;*** - 2 ou + espaces - chaîne de caractére - 1 ou + espaces - chaines de caractére>
    	if($lines =~ /;\*\*\*\s{2,}(.+?)\s+(.+)/)
    	{
     
    		$adresse=$1;
                    $nom=$2;
    		#on retire les espaces et les ;***
    		print(FICHOUT "$adresse;$nom\n");
    		$i++;
    	}
     
    }
    Merci pour vos reponses

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

Discussions similaires

  1. Mise en page fichier texte
    Par rogerone dans le forum Pascal
    Réponses: 1
    Dernier message: 03/10/2009, 16h56
  2. Mise en page d un fichier texte
    Par mika95013 dans le forum Langage
    Réponses: 2
    Dernier message: 24/08/2006, 12h53
  3. Réponses: 11
    Dernier message: 17/05/2006, 10h48
  4. Réponses: 2
    Dernier message: 10/05/2006, 20h10
  5. Réponses: 1
    Dernier message: 05/05/2006, 10h36

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