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 :

Une chaîne contient-elle une autre chaîne ?


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
    Septembre 2008
    Messages
    28
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2008
    Messages : 28
    Par défaut Une chaîne contient-elle une autre chaîne ?
    Bonjour,

    Je dispose de 2 fichiers:
    - le premier contient des identifiants.
    ex:
    toto
    titi
    tata

    - le deuxième contient des lignes qui contiennent ou non ces identifiants.
    ex:
    998 titi pour Pierre
    6 bidule pour Céline
    5 tata pour Paul
    79 pipo pour Corinne


    Mon but est de faire un scipt PERL qui parse les deux fichiers, afin de produire un troisième fichier, qui ne contiendrait que les lignes du deuxième fichier dont les identifiants sont contenus dans le premier fichier.
    ex:
    998 titi pour à Pierre
    5 tata pour Paul


    J'ai écrit ça:
    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
    #!/usr/local/bin/perl
     
    $file_identifiant = "ident.txt";
    $file_liste_obs   = "liste.txt";
     
    open( INFO, $file_identifiant );        # Ouvre le fichier
    @lines_identifiant = <INFO>;            # Lit le fichier, et le met dans un tableau
    close(INFO);                            # Ferme le fichier
     
    open( INFO, $file_liste_obs );          # Ouvre le fichier
    @lines_liste_obs = <INFO>;              # Lit le fichier, et le met dans un tableau
    close(INFO);                            # Ferme le fichier
     
    # FICHIER DE SORTIE
    # -----------------
    $out = 'OUTPUT.txt';
    open( OUT, "> $out" );
     
    foreach $identifiant (@lines_identifiant)
            {
            #print OUT "$identifiant";
            foreach $liste_obs (@lines_liste_obs)
                    {
                    if ($liste_obs =~ /$identifiant/)
                            {
    	                print OUT "$liste_obs";
                            }
                    }
            }
     
    # FERMETURE FIC SORTIE
     
    close OUT;
     
    print "\n";
    print "\n";
    print "... FIN ...\n";
    Ca ne marche pas !!!

    Je pense que le test
    if ($liste_obs =~ /$identifiant/)
    ne marche pas.

    Si je mets
    if ($liste_obs =~ /toto/)
    ça me trouve bien toutes les lignes où il y a "toto", mais pour moi, les infos à chercher sont des variables ($identifiant / @lines_identifiant) et pas des chaines en dur...

    Comment faire ? Je débute en PERL et je dois faire une bêtise grosse comme moi (peut-on mettre des variables dans entre les / / )?

    Merci d'avance !

  2. #2
    Membre averti
    Profil pro
    Inscrit en
    Juin 2004
    Messages
    22
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2004
    Messages : 22
    Par défaut
    Salut, Essaye chomp sur ton $identifiant

    http://perl.enstimac.fr/DocFr/perlfunc.html#item_chomp

    Si tu debutes en perl alors prend l'habitude de "use strict;"

  3. #3
    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
    Ton programme imbriquant 2 boucles risque de ne pas répondre exactement comme tu le souhaite, à savoir, si une ligne de ton fichier d'observation contient deux identifiants, elle apparaitra 2 fois dans ton fichier de résultat.

    Donc, en plus de chomper les identifiants, je te propose deux autres alternatives, l'une utilisant une expression régulière unique pour tous les identifiants, l'autre utilisant la fonction grep.

    En plus du chomp, je te recommande de quoté les identifiants, ce qui permet d'identifier aussi des caractères spéciaux de motif (comme le ., les parenthèses, l'*, le +, ...).

    Voici ce que ton script pourrait donner :
    Version avec une regexp :
    Code perl : 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
     
    #!/usr/bin/perl
     
    use strict;
    use warnings;
     
    my $file_identifiant = "ident.txt";
    my $file_liste_obs   = "liste.txt";
     
    # Ouvre le fichier des identifiants, le lit, et le met dans un tableau puis le ferme
    open my $IDENT, "<", $file_identifiant or die "Can't open file $file_identifiant for reading ($!)";
    chomp(my @lines_identifiant = <$IDENT>);
    close $IDENT;
    my $identifiant_re = join "|", map quotemeta, @lines_identifiant;
    $identifiant_re = qr{$identifiant_re};
     
    # Ouvre le fichier d'observations, le lit, et le met dans un tableau puis le ferme
    open my $OBS, "<", $file_liste_obs or die "Can't open file $file_liste_obs for reading ($!)";
     
    # FICHIER DE SORTIE
    # -----------------
    my $out = 'OUTPUT.txt';
    open my $OUT, ">",  $out or die "Can't open file $out for writting ($!)";
    foreach my $obj (<$OBS>) {
        print $OUT $obj if $obj =~ $identifiant_re;
    }
     
    # FERMETURE FIC SORTIE
    close $OUT;
    close $OBS;
     
    print "\n";
    print "\n";
    print "... FIN ...\n";

    Version 2, avec un grep :
    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
    #!/usr/bin/perl
     
    use strict;
    use warnings;
     
    my $file_identifiant = "ident.txt";
    my $file_liste_obs   = "liste.txt";
     
    # Ouvre le fichier des identifiants, le lit, et le met dans un tableau puis le ferme
    open my $IDENT, "<", $file_identifiant or die "Can't open file $file_identifiant for reading ($!)";
    chomp(my @lines_identifiant = <$IDENT>);
    close $IDENT;
     
    # Ouvre le fichier d'observations, le lit, et le met dans un tableau puis le ferme
    open my $OBS, "<", $file_liste_obs or die "Can't open file $file_liste_obs for reading ($!)";
     
    # FICHIER DE SORTIE
    # -----------------
    my $out = 'OUTPUT.txt';
    open my $OUT, ">",  $out or die "Can't open file $out for writting ($!)";
    foreach my $obj (<$OBS>) {
        print $OUT $obj if grep $obj =~ $_, @lines_identifiant;
    }
     
    # FERMETURE FIC SORTIE
    close $OUT;
    close $OBS;
     
    print "\n";
    print "\n";
    print "... FIN ...\n";

  4. #4
    Membre averti
    Profil pro
    Inscrit en
    Septembre 2008
    Messages
    28
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2008
    Messages : 28
    Par défaut
    Un grand MERCI à vous !!!

    Je débouche le chompagne

  5. #5
    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
    A la tienne !

Discussions similaires

  1. [Batch] Créer une chaine à partir d'une variable et d'une autre chaine
    Par mlle lain dans le forum Scripts/Batch
    Réponses: 1
    Dernier message: 10/11/2009, 17h26
  2. Réponses: 2
    Dernier message: 05/01/2009, 13h45
  3. Réponses: 5
    Dernier message: 22/05/2008, 15h42
  4. Copier une table Access d'une base de données à une autre
    Par Marie S. dans le forum VB 6 et antérieur
    Réponses: 7
    Dernier message: 23/05/2007, 13h09
  5. copie d'une table Y d'une base A vers une table X d'une base
    Par moneyboss dans le forum PostgreSQL
    Réponses: 1
    Dernier message: 30/08/2005, 22h24

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