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 :

Script de comparaison de fichiers DNS


Sujet :

Langage Perl

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2013
    Messages
    326
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Octobre 2013
    Messages : 326
    Par défaut Script de comparaison de fichiers DNS
    Bonjour à tous,

    Je suis en train de dév un script en perl 5.x qui va me permettre de comparer deux fichiers de zones dans deux vues différentes (vue 1, vue2). Je dois répéter cette opération X fois, X étant le nombre de fichiers de zones à traiter.
    Je dois effectuer les actions suivantes :
    - Pour les enregistrements qui sont strictement pareils dans la zone1 de la vue1 et de la vue2, je dois créer un fichier zone1 qui va lister l'ensemble des lignes exactement pareilles.
    - Pour les enregistrements qui ne sont que dans la zone1 de la vue1, je dois créer un fichier zone1 qui va lister les enregistrements uniques de cette zone de la vue1
    - Pour les enregistrements qui ne sont que dans la zone1 de la vue2, je dois faire comme le point du dessus
    Pour les traitements ci-dessus je ne rencontre aucun problème particulier, je boucle sur un fichier en greppant chaque ligne dans le second et ça fonctionne très bien.

    Enfin ce qui me pose problème :
    - Pour les enregistrements qui sont similaires mais PAS IDENTIQUES dans la zone1 de la vue1 ET dans la zone1 de la vue2.
    Un exemple OK :
    (zone1 - vue1)test.test.fr IN A 1.1.1.1
    (zone1 - vue2)test.test.fr IN A 2.2.2.2


    Un exemple NOK :
    (zone1 - vue1)test.test.fr IN A 2.2.2.2
    (zone1 - vue2)test.test.fr IN A 2.2.2.2


    J'ai vraiment du mal à imaginer comment m'en sortir. J'étais parti du principe qu'il y a plus de lignes exactement identiques qu'autre chose du coup j'en suis arrivé à ce bout de 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
    sub similarity {
            for ($i = 0 ; $i < scalar(@list_files) ; $i++) {
                    chomp($list_files[$i]);
                    system "touch similarity/$list_files[$i]";
                    print "Fichier de zone : $list_files[$i]\n";
                    # Récupération des lignes du premier fichier
                    open(FILE,"<","vue1/$list_files[$i]");
                    @lines = <FILE>;
                    close(FILE);
                    # Ouverture du fichier final
                    open(FILE,">","similarity/$list_files[$i]");
                    # Boucle sur les lignes du premier fichier
                    foreach(@lines) {
                            chomp($_);
                            system("grep '$_' vue2/$list_files[$i]");
                            if ($? != 0) {
                                    # Récupération des enregistrements qui ne sont pas identiques
                                    if ($_ =~ m/(.*[[:space:]]*[0-9]*IN.[A-Z]*)/) {
                                            push @similarities, $_;
                                            push @remaining, $1;
                                    }
                            }
                    }
                    # Boucle sur les enregistrements restants => ceux qui sont forcément différents / similaires
                    for($j = 0 ; $j < scalar(@remaining) ; $j++) {
                            chomp($remaining[$j]);
                            system("grep '$remaining[$j]' vue2/$list_files[$i]");
                            if ($? == 0) {
                                    print FILE "$similarities[$j]\n";
                            }
                    }
            }
    }
    Je suis pas loin d'avoir ce que je veux mais il me faudrait dans le même temps la ligne qui est similaire dans la vue2, dans ce bout de code je n'ai que les enregistrements de la vue1

    Merci d'avance 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
    Billets dans le blog
    1
    Par défaut
    Bonjour,

    pourrais-tu définir plus précisément ce que tu entends pas "similaires mais pas identiques"? Veux-tu dire que le début de la ligne est identique, mais pas la fin? Dans ce cas, "début de ligne" veux dire première partie entre parenthèses avec un numéro de zone et un numéro de vue?

    En attendant tes réponses, je pense que ta façon de faire des appels systèmes pour faire des touch ou des grep est loin d'être idéale. Perl possède tous les fonctions nécessaires pour faire ce que tu veux avec des commandes internes. En outre, bien que tu ne montres pas le reste du code, il semble que tu lises chaque fichier au moins deux ou trois fois. Ce n'est pas très efficace. Il vaudrait mieux lire chaque fichier une fois (dans des tableaux ou des hachages) et faire ensuite tes différents rapprochements en mémoire.

    Finalement une petite question pour que je puisse éventuellement te proposer un bout de code la prochaine fois: tes fichiers sont-ils triés par zones?

  3. #3
    Membre éprouvé Avatar de olivier1969
    Homme Profil pro
    Assistant aux utilisateurs
    Inscrit en
    Novembre 2013
    Messages
    153
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Assistant aux utilisateurs
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Novembre 2013
    Messages : 153
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    # Pour chaque fichier tu alimentes le hash
    # Boucle sur les lignes du fichier
    foreach(@lines) {
    	chomp($_);
    	$hash{$_}++
    }
    Pour chaques lignes identiques les valeurs des clés seront supérieures à 1 -> tu alimentes donc ton fichier zone1 avec les clés contenant zone1

    Pour chaques lignes dont les valeurs seront = 1 tu alimentes ton fichier en fonction des zone et des vues de chaque clé

    Enfin si j'ai bien compris ce que tu veux faire ...

Discussions similaires

  1. Script de comparaison de SHA256 avec un fichier
    Par villegente dans le forum Shell et commandes GNU
    Réponses: 2
    Dernier message: 17/09/2012, 20h00
  2. help script perl comparaison de deux fichiers
    Par nosuperman dans le forum Langage
    Réponses: 51
    Dernier message: 21/03/2012, 09h11
  3. script de comparaison de fichiers
    Par olemoine dans le forum Langage
    Réponses: 2
    Dernier message: 07/02/2008, 11h12
  4. Script de comparaison 2 fichiers
    Par kalimerou dans le forum Linux
    Réponses: 4
    Dernier message: 02/02/2007, 14h11
  5. script : comparaison de fichiers Excel
    Par M@XflY dans le forum Général Dotnet
    Réponses: 1
    Dernier message: 10/01/2007, 15h15

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