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 :

Comparer le contenu de deux fichiers


Sujet :

Langage Perl

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    37
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 37
    Points : 12
    Points
    12
    Par défaut Comparer le contenu de deux fichiers
    Bonjour à tous,

    Je me suis mis en tête (aujourd'hui) de réaliser un bout de programme, mais ça fait des années que je n'ai pas programmé quoi que se soit et je n'ai jamais touché au perl

    Après une bonne après midi de recherche, je suis très loin d'avoir même la base de mon programme donc ... (en + je débute sous Linux : la totale !!!)

    Voilà ce que je veux faire : a. Ouvrir un fichier texte (Ta)
    b. Prendre le 1er mot
    c. Voir si ce mot est aussi présent dans un second fichier (Tb)
    d. Stocker le résultat dans une variable
    (1 = PRESENT : OUI / 0 = PRESENT : NON)
    e. Passer au second mot du fichier Ta et recommencer à c

    Bien sûr, c'est juste une base ... et encore je suis INCAPABLE d'y arriver pour le moment. Toute aide est donc sincèrement la bienvenue !

    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
    open (FICH1, '/home/debutperl/charte.txt') || die ("pas de fichier charte.txt\n");
    open (FICH2, '/home/debutperl/dico.txt') || die ("pas de fichier dico.txt\n");
     
    my $texte = <FICH1>;
    my $dico = <FICH2>;
    my $n = 0;
     
    #while ( $texte =~ /\pL+/g ) {
    #    $n++;
    #    print "Mot numéro ", $n, " : ", $&, "\n"; => le code trouvé
    #}
     
    # $n est le numéro du mot
    # $& le mot en lui même
     
    while ( $texte =~ /\pL+/g ) {
        $n++;
        #print "Mot numéro ", $n, " : ", $&, "\n";
    	#$test = $&
        if ($& eq $dico) {
        	print "Mot numéro ", $n, " : ", $&, " OUI ", "\n"; }
        else {
        	print "Mot numéro ", $n, " : ", $&, " NON ", "\n";
        }
    }
    Voilà ce que j'ai fait pour le moment : bien entendu ! Ca ne ressemble à rien & je me suis inspiré d'un code trouvé sur internet. Je le met juste pour prouver ma bonne volonté .

    Encore merci beaucoup à tous ceux qui voudront bien m'aider.
    Cordialement.
    .N

  2. #2
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    37
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 37
    Points : 12
    Points
    12
    Par défaut
    Personne n'a encore eu le courage de m'aider, ce que je comprends très bien
    En attendant, j'ai un peu progressé et j'ai réalisé ce bout de code, qui est une base de départ et qui marche :

    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
    #!/usr/local/bin/perl
     
    open (FICH1, '/home/debutperl/charte.txt') || die ("pas de fichier charte.txt\n");
    open (FICH2, '/home/debutperl/dico.txt') || die ("pas de fichier dico.txt\n");
     
    my $texte = <FICH1>;
    my $c = 0;
     
    # stoquer le texte CHARTE.TXT dans un tableau
    while ( $texte =~ /\pL+/g ) {
        $n++;
        push(@charte, $&);
    }
    close (FICH1);
     
    # stoquer le texte DICO.TXT dans un tableau
    my $texte = <FICH2>;
    while ( $texte =~ /\pL+/g ) {
        $n++;
        push(@dico, $&);
    }
    close (FICH1);
     
    foreach $mot (@charte)					
    {
    	#print "$mot\n";	
    	foreach $lexique (@dico)
    		{
    			if ($lexique eq $mot)
    			{
    				print "$mot\n";
    				$c++;
    			}
    		}
    }
     
    print "---------> ";
    print "mots présents dans le dico ", "$c\n";
    Maintenant le problème qui se pose à moi est les suivant :

    Pour le moment je dois arranger mon fichier "dico.txt" pour que les mots soient listés en ligne : ça ne m'arrange pas du tout. Néanmoins, si j'exécute la procédure avec un fichier possédant 1 mot par colonne (type dictionnaire pour OpenOffice), je n'arrive pas à faire fonctionner mon "programme" ... quelqu'un a une idée pour qu'il fonctionne pour un fichier avec des entrées en colonnes ?
    N.B : en gros passer de (bonjour salut coucou çava ...)
    à
    bonjour
    salut
    coucou
    çava
    => et que ça fonctionne quand même.

    Si quelqu'un veut bien m'aider, qu'il soit plus que remercié
    .N

  3. #3
    Membre émérite
    Avatar de Jasmine80
    Femme Profil pro
    Bioinformaticienne
    Inscrit en
    Octobre 2006
    Messages
    3 157
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 44
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Bioinformaticienne
    Secteur : Santé

    Informations forums :
    Inscription : Octobre 2006
    Messages : 3 157
    Points : 2 673
    Points
    2 673
    Par défaut
    Citation Envoyé par LongShadedEyes Voir le message
    Pour le moment je dois arranger mon fichier "dico.txt" pour que les mots soient listés en ligne : ça ne m'arrange pas du tout.
    Ce n'est pas nécessaire. Quelles sont les structures de tes 2 fichiers? Plusieurs mots sur plusieurs lignes? Quel est le séparateur?


    Pour ce qui est de ton programme, tu pourrais faire quelque chose de ce genre
    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
    #!/usr/local/bin/perl
     
    use strict;
    use warnings;
     
     
    =h
     
    a. Ouvrir un fichier texte (Ta)
    b. Prendre le 1er mot
    c. Voir si ce mot est aussi présent dans un second fichier (Tb)
    d. Stocker le résultat dans une variable
    (1 = PRESENT : OUI / 0 = PRESENT : NON)
    e. Passer au second mot du fichier Ta et recommencer à c
     
    =cut
     
     
    open my $fich1, '<', '/home/debutperl/charte.txt' || die ("pas de fichier charte.txt\n");
    open my $fich2, '<','/home/debutperl/dico.txt') || die ("pas de fichier dico.txt\n");
     
     
     
    # récupération des mots à tester dans un tableau
    # fichier : 1 mot par ligne
    my @charte = <$fich1>;
    close $fich1;
     
    my %chart_tab;
     
    # suppression des enter en fin de ligne
    map {chomp($_)} @charte;
     
    # mise des mots dans un tableau associatif 
    # clé = mot    valeur = 0
    map {$chart_tab{$_} = 0;} @charte;
     
     
    while (my $line = <$fich2>){
     
    	chomp $line;
    	if (exists $chart_tab{$line}){
    		# on met à 1 la valeur des mots trouvés
    		$chart_tab{$line} = 1;
    	}	
    }
     
    close $fich2;
     
    my $nbr_mots = () = grep {$_== 1}  values(%chart_tab); 
    print "$nbr_mots mots trouvés\n";
    EDIT : calcul du nombre de mots via la fonction grep()
    -- Jasmine --

  4. #4
    Membre émérite
    Avatar de Jasmine80
    Femme Profil pro
    Bioinformaticienne
    Inscrit en
    Octobre 2006
    Messages
    3 157
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 44
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Bioinformaticienne
    Secteur : Santé

    Informations forums :
    Inscription : Octobre 2006
    Messages : 3 157
    Points : 2 673
    Points
    2 673
    Par défaut
    Citation Envoyé par LongShadedEyes Voir le message
    Pour le moment je dois arranger mon fichier "dico.txt" pour que les mots soient listés en ligne : ça ne m'arrange pas du tout.
    Si tu as plusieurs mots à récupérer par ligne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    my @charte;
     
    foreach my $line (@file1){
     
    	# récupération des différents mots présents par ligne
    	# séparateur : des espaces
    	my @liste_mots = split /\s+/, $line;
     
    	# mise de l'ensemble des mots récupérés dans le tableau
    	push @charte, @liste_mots;
    }
    -- Jasmine --

  5. #5
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    37
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 37
    Points : 12
    Points
    12
    Par défaut
    Eh
    Merci beaucoup ... je dois travailler ce matin, mais je regarde ça ce midi ou bien ce soir et je te dis. C'est vraiment très sympa.

    .N

  6. #6
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    37
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 37
    Points : 12
    Points
    12
    Par défaut
    Bonsoir,

    Alors, j'ai testé le programme que tu m'a donné : ça ne marche pas ici (normal tu n'a pas les fichiers pour le tester etc.). La méthode a pourtant l'air beaucoup plus "clean" que la mienne ... dommage. Je vais essayer de comprend pourquoi (ce n'est pas gagné).

    Sinon, j'ai toujours mon problème pour charger différentes lignes ; du type :

    pratum
    aqua
    sicut
    terra
    domini

    Ca c'est mon fichier dico.txt (pour le moment j'ai du le mettre en "bout à bout", mais ça ne marchera pas pour la suite). J'aimerais garder le même programme que celui que j'ai donné seulement en changeant ce point.

    Pour l'instant j'ai donc cette algo, mais qui ne charge que si les mots sont bout à bout :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    # stoquer le texte DICO.TXT dans un tableau
    my $texte = <FICH2>;
    while ( $texte =~ /\pL+/g ) {
        $n2++;
        push(@dico, $&);
    }
    close (FICH1);
    Je voudrais juste modifier cette partie (si possible )

    Merci beaucoup pour ton aide en tout cas ... je sens que ça va avancer cette affaire
    ps : désolé je me rends compte que je n'avais pas été clair du tout plus haut.

  7. #7
    Membre émérite
    Avatar de Jasmine80
    Femme Profil pro
    Bioinformaticienne
    Inscrit en
    Octobre 2006
    Messages
    3 157
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 44
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Bioinformaticienne
    Secteur : Santé

    Informations forums :
    Inscription : Octobre 2006
    Messages : 3 157
    Points : 2 673
    Points
    2 673
    Par défaut
    Quel est le message d'erreur avec mon premier script? Il y a une parenthèse fermante qui se balade dans l'open() du second fichier.
    Peut-être vaudrait-il mieux stocker tes valeurs dans un tableau associatif, ou alors utiliser un module tel que List::Compare ... c'est toujours mieux que des boucles telles que :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    foreach $mot (@charte)					
    {
    	#print "$mot\n";	
    	foreach $lexique (@dico)
    		{
    			if ($lexique eq $mot)
    			{
    Dois-tu également récupérer les mots du fichier 2 non présents dans le fichier 1?


    Pour la partie qui te pose problème : stoquer le texte DICO.TXT dans un tableau

    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
    #!/usr/local/bin/perl
     
    use strict;
    use warnings;
     
     
     
     
    open my $fich2, '<','/home/debutperl/dico.txt' || die ("pas de fichier dico.txt\n");
     
     
     
    # récupération des mots à tester dans un tableau
    # fichier : 1 mot par ligne
    my @dico = <$fich2>;
    close $fich2;
     
    # suppression des enter en fin de ligne
    map {chomp($_)} @dico;
     
     
    # mise des mots dans un tableau associatif 
    # clé = mot    valeur = 0
    my %dico_tab;
    map {$dico_tab{$_} = 0;} @dico;

    Donne moi un petit bout de ton second fichier que je puisse tester mon précédent script. merci.
    -- Jasmine --

  8. #8
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    37
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 37
    Points : 12
    Points
    12
    Par défaut
    Excuse moi, je n'avais pas encore eu le temps de revenir.
    Je m'occupe de ça d'ici se soir, en te priant de m'excuser pour ma lenteur.

    Merci beaucoup pour ton aide.
    Cordialement.

Discussions similaires

  1. Comparer contenu de deux fichiers
    Par Garkan dans le forum Shell et commandes GNU
    Réponses: 3
    Dernier message: 08/07/2013, 10h10
  2. comparer contenu de deux fichiers
    Par Earl7 dans le forum Langage
    Réponses: 5
    Dernier message: 02/02/2009, 16h07
  3. comparer le contenu de deux tables?
    Par sessime dans le forum Requêtes
    Réponses: 5
    Dernier message: 07/03/2006, 14h05
  4. Comparer le contenu de deux vecteurs
    Par misou83 dans le forum Collection et Stream
    Réponses: 11
    Dernier message: 20/07/2005, 17h17
  5. Comment comparer le contenu de 2 fichiers ?
    Par steph_1 dans le forum Langage
    Réponses: 4
    Dernier message: 17/06/2005, 18h38

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