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 :

supression de répetition de lignes


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
    Avril 2006
    Messages
    32
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 32
    Par défaut supression de répetition de lignes
    salut a tous
    j'ai écrit un script perl qui "normalement" ouvre un fichier et supprime les répetions des ligne... c'est un peu compliqué a expliquer ,je donne un exemple ;
    le fichier est
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    a   blalalalalla 
    a ffffff 
    fdd eeeeeeeeeee 
    fdd    eeeeeeeee 
    ff azerty 
    f  azerty
    les répétitions ici sont dans la premiére partie de chaque ligne or avent au moins 1 espace exp: a dans ligne 1 et a dans ligne 2 il dois supprimer une des deux ligne '' c'est une repetition' et aussi pour "fdd"
    mais pa ff et f ce n'est pas la meme ligne
    le script dois me donner un fichier en sortie ne contenant pas de repetitions .
    voici mon scropt qui ne fonctionne pas ,
    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
    open(FILE1,"</work//trans") or die"open: $!";
    open(FILE2,">/work/rsrc/dictionnaire") or die"open: $!";
    my($linei,$linej,$moti,@phonesi,$motj,@phonesj);
    while( defined( $linei = <FILE1> ) )
    {    ($moti,@phonesi)= split(/\s/,$linei);  
        print(FILE2 "$linei");
        if (defined ($linej = <FILE1>))
        {($motj,@phonesj)= split(/\s/,$linej);
            if ( ($motj eq $moti) && ($motj !~ m/\(/) && ($moti !~ m/\(/) && (@phonesj ne @phonesi) )
        {print "$linei";    print "$linej";
            }
            else
            {            
            }
        }
    }
    close(FILE1);
    close(FILE2);
    merci de corriger mon script ou en bref je veux de l'aide

  2. #2
    Expert confirmé
    Avatar de Jedai
    Homme Profil pro
    Enseignant
    Inscrit en
    Avril 2003
    Messages
    6 245
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Avril 2003
    Messages : 6 245
    Par défaut
    Fais un effort pour avoir une présentation correcte : en fait arrête d'essayer de présenter ton message à part les balises [ code ] et éventuellement [ quote ], ton message est pratiquement illisible. Je corrige la mise en forme pour cette fois, mais je ne le ferais pas la prochaine fois.

    --
    Jedaï

  3. #3
    Expert confirmé
    Avatar de Jedai
    Homme Profil pro
    Enseignant
    Inscrit en
    Avril 2003
    Messages
    6 245
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Avril 2003
    Messages : 6 245
    Par défaut
    Ensuite essaie d'avoir une indentation correcte de ton code (il y a des programmes qui te font ça très bien si tu veux).
    Par ailleurs il est inutile de mettre un else{} si son bloc est vide.

    En fait tu fais trop compliqué, il est préférable de réfléchir d'abord à une solution simple en pseudo-code, puis de l'implémenter proprement :
    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
     
    #! /usr/bin/perl
    use strict;
    use warnings;
     
    open my $in, '<', "test_in_out.txt" or die "open: $!";
    open my $out, '>', "out" or die "open: $!";
     
    my $last_tag = '';
     
    while( <$in> )
    {
      my ($tag) = (m/^(\S*)\s/);
      print $out $_ unless $tag eq $last_tag;
      $last_tag = $tag;
    }
     
    close($in);
    close($out);
    --
    Jedaï

  4. #4
    Membre averti
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    32
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 32
    Par défaut
    salut
    désolé pour la présentation faite , c'est la fatigue ..!!!
    le script que tu m'a donné fonctionne mais ne supprime pas toutes les répetitions . il supprime que celles qui sont dans deux lignes successives .
    j'ai un exemple dans le fichier out :
    ligne1 anti-américain a~ t i a m e R i k U~
    ligne2 antiaméricain a~ t i a m e R i k U~
    ligne3 anti-américain a~ t i a m e R i k U~e~
    ligne4 antiaméricain e~a~ t i a m e R i k U~
    ligne5 anti-américaine a~ t i a m e R i k E n
    ligne6 antiaméricaine a~ t i a m e R i k E n
    ligne7 anti-américaines a~ t i a m e R i k E n
    ligne8 antiaméricaines a~ t i a m e R i k E n
    par exemple la ligne 1 et 3 sont les memes , la 2 et la 4 ..........
    merci

  5. #5
    Expert confirmé
    Avatar de Jedai
    Homme Profil pro
    Enseignant
    Inscrit en
    Avril 2003
    Messages
    6 245
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Avril 2003
    Messages : 6 245
    Par défaut
    Citation Envoyé par donmamio
    salut
    désolé pour la présentation faite , c'est la fatigue ..!!!
    le script que tu m'a donné fonctionne mais ne supprime pas toutes les répetitions . il supprime que celles qui sont dans deux lignes successives .
    Il faut faire attention quand on donne un exemple de ne pas donner de fausse idée et de choisir un exemple le plus générique possible !

    Voici une légère modification de mon script qui fera ce que tu veux :
    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
     
    #! /usr/bin/perl
    use strict;
    use warnings;
     
    open my $in, '<', "test_in_out.txt" or die "open: $!";
    open my $out, '>', "out" or die "open: $!";
     
    my %tags;
    while( <$in> )
    {
      my ($tag) = (m/^(\S*)\s/);
      print $out $_ unless $tags{$tag}++;
    }
     
    close($in);
    close($out);

  6. #6
    Membre Expert
    Avatar de Woufeil
    Profil pro
    Étudiant
    Inscrit en
    Février 2006
    Messages
    1 076
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2006
    Messages : 1 076
    Par défaut
    Salut !

    J'ai fais un script mais je crois qu'i n'est pas optimisé, vous en pensez quoi ? J'ai commencé par trié le fichier car visiblement il ne l'est pas...
    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;
     
    open(FILE1,"<in.txt") or die"open: $!";
    open(FILE2,">out.txt") or die"open: $!";
    my @tab = <FILE1>;
    @tab = sort @tab;
    foreach my $lettre ("a".."z")
    {
        for (my $i = 0; $i<$#tab; $i++)
        {
            if ($tab[$i] =~ /^$lettre/)
            {
                my ($reg) = $tab[$i] =~ /^(.*)\s/;
                for (my $j = $i+1 ;exists $tab[$j]; $j++)
                {
                    $tab[$j] = "" if $tab[$j] =~ m/$reg/;
                    last unless $tab[$j] =~ /^$lettre/;
                }
            }
        }
    }
     
    foreach my $elem (@tab)
    {
        print FILE2 "$elem\n" if $elem ne "";
    }
     
    close FILE1;
    close FILE2;
    J'ai essayé de faire comparer les lignes seulement si elles commencaient par la même lette pour éviter les comparaisons inutiles, c'st déjà mieux que de comparer toutes les lignes entre elles, mais je suis sur qu'il y a beaucoup mieux...

  7. #7
    Membre expérimenté
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    172
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2005
    Messages : 172
    Par défaut
    Salut,
    Citation Envoyé par donmamio
    qui "normalement" ouvre un fichier et supprime les répetions des ligne... c'est un peu compliqué a expliquer ,je donne un exemple ;
    le fichier est
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    a   blalalalalla 
    a ffffff 
    fdd eeeeeeeeeee 
    fdd    eeeeeeeee 
    ff azerty 
    f  azerty
    les répétitions ici sont dans la premiére partie de chaque ligne or avent au moins 1 espace exp: a dans ligne 1 et a dans ligne 2 il dois supprimer une des deux ligne '' c'est une repetition' et aussi pour "fdd"
    mais pa ff et f ce n'est pas la meme ligne
    le script dois me donner un fichier en sortie ne contenant pas de repetitions
    Personnellemnt je trouve un peu bizarre comme question.
    Quelle ligne il faut supprimer?

    a blalalalalla
    ou
    a ffffff


    lami20j

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

Discussions similaires

  1. [XL-2003] Débutant - macro pour supression de colonnes et lignes vide
    Par domcoool dans le forum Macros et VBA Excel
    Réponses: 5
    Dernier message: 15/11/2010, 10h59
  2. supression de retour à la ligne dans un fichier
    Par piotr dans le forum Langage
    Réponses: 4
    Dernier message: 08/10/2007, 14h51
  3. Réponses: 1
    Dernier message: 28/09/2006, 11h43
  4. [VBA-E] Supression ligne tableau croisé dynamique
    Par julien5 dans le forum Macros et VBA Excel
    Réponses: 9
    Dernier message: 19/05/2006, 15h13
  5. [FB1.5][BCB5]Supression de lignes ??
    Par Sitting Bull dans le forum Connexion aux bases de données
    Réponses: 3
    Dernier message: 19/10/2004, 14h56

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