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 :

Tri et comptage des lignes


Sujet :

Langage Perl

  1. #1
    Membre régulier

    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    90
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2009
    Messages : 90
    Points : 119
    Points
    119
    Par défaut Tri et comptage des lignes
    Bonsoir,

    Voici mon fichier d'origine :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    <chaine de caractère quelconque> one:1.2.3.4/50 <chaine de caractère quelconque> two:4.1.3.1/12
    <chaine de caractère quelconque> one:2.10.20.1/33 <chaine de caractère quelconque> two:7.65.0.6/45
    <chaine de caractère quelconque> one:200.11.4.9/22 <chaine de caractère quelconque> two:90.1.70.1/198
    <chaine de caractère quelconque> one:2.10.20.1/33 <chaine de caractère quelconque> two:7.65.0.6/45
    <chaine de caractère quelconque> one:200.11.4.9/50 <chaine de caractère quelconque> two:90.1.70.1/198
    <chaine de caractère quelconque> one:1.2.3.4/50 <chaine de caractère quelconque> two:4.1.3.1/12
    <chaine de caractère quelconque> one:1.2.3.4/50 <chaine de caractère quelconque> two:4.1.3.1/12
    <chaine de caractère quelconque> one:6.60.121.7/120 <chaine de caractère quelconque> two:12.54.30.1/111
    <chaine de caractère quelconque> one:1.2.3.4/50 <chaine de caractère quelconque> two:4.1.3.1/15
    etc...
    Et j'aimerai trier les lignes selon les nombres situés après 'one:' et après 'two:' (tout en calculant le nombre de lignes), donc obtenir quelquechose du 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
    <chaine de caractère quelconque> one:1.2.3.4/50 <chaine de caractère quelconque> two:4.1.3.1/12
    <chaine de caractère quelconque> one:1.2.3.4/50 <chaine de caractère quelconque> two:4.1.3.1/12
    <chaine de caractère quelconque> one:1.2.3.4/50 <chaine de caractère quelconque> two:4.1.3.1/12
    Total : 3
     
    <chaine de caractère quelconque> one:1.2.3.4/50 <chaine de caractère quelconque> two:4.1.3.1/15
    Total : 1
     
    <chaine de caractère quelconque> one:2.10.20.1/33 <chaine de caractère quelconque> two:7.65.0.6/45
    <chaine de caractère quelconque> one:2.10.20.1/33 <chaine de caractère quelconque> two:7.65.0.6/45
    Total : 2
     
    <chaine de caractère quelconque> one:200.11.4.9/22 <chaine de caractère quelconque> two:90.1.70.1/198
    <chaine de caractère quelconque> one:200.11.4.9/22 <chaine de caractère quelconque> two:90.1.70.1/198
    Total : 2
     
    <chaine de caractère quelconque> one:6.60.121.7/120 <chaine de caractère quelconque> two:12.54.30.1/111
    Total : 1
     
    etc...
    Autrement dit, j'aimerai regrouper les lignes qui possèdent la même chaine de caractère situé après 'one:' et après 'two:'.

    Quelle méthode pourrai-je utiliser ?

    Merci d'avance.

  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
    Points : 12 256
    Points
    12 256
    Billets dans le blog
    1
    Par défaut
    Utilise un hash et concatène les lignes dans le hash.

  3. #3
    Membre régulier

    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    90
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2009
    Messages : 90
    Points : 119
    Points
    119
    Par défaut
    Voici la méthode que j'ai appliquée qui me créé le fichier voulu:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    my %lignes = ();
        while (my $ligne = <FIC>) {
     	chomp $ligne;
     	if ($ligne =~ /.*one:(.*/\d+).*two:(.*/\d+).*/) {
     	    my $cle = "$1 $2";
     	    $lignes {$cle} .= "$cle : $ligne\n";
     	}
        }
        print FIC_OUT "$lignes{$_}\n" foreach sort {$a cmp $b} keys %lignes;
    Mais comment comptabiliser et afficher le nombre de lignes pour chaque clé ?

  4. #4
    Membre actif Avatar de brice45
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2005
    Messages
    188
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Mai 2005
    Messages : 188
    Points : 236
    Points
    236
    Par défaut
    Bonjour,

    plutôt que de mettre ta ligne dans la valeur de ton hash passe la en clé. Par ex si ton hash s'appelle hash tu auras :
    ensuite pour avoir un compteur incrémente ton hash dans la boucle. La valeur qu'il prendra te donne la valeur du compteur :

    Dans ton code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    while (my $ligne = <FIC>) {
     	chomp $ligne;
     	if ($ligne =~ /.*one:(.*/\d+).*two:(.*/\d+).*/) {
     	    my $cle = "$1 $2";
     	    $hash{$cle}{$ligne}++;
     	}
        }

  5. #5
    Membre régulier

    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    90
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2009
    Messages : 90
    Points : 119
    Points
    119
    Par défaut
    Merci, mais je ne saisis pas tout.

    En effet, comment je peux trier mes lignes selon les clés avec cette méthode?

    Et donc comment transformer cette ligne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    print FIC_OUT "$lignes{$_}\n" foreach sort {$a cmp $b} keys %lignes;
    en ajoutant en plus le compteur.

  6. #6
    Membre actif Avatar de brice45
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2005
    Messages
    188
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Mai 2005
    Messages : 188
    Points : 236
    Points
    236
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    open (FIC_OUT, "> $monfichier");
     
    foreach my $key (sort keys %hash) {
    	foreach my $key2 (sort keys %{$hash{$key}) {
    		print FIC_OUT "$key $key2 $hash{$key}{$key2}\n";
    	}
    }	
    close FIC_OUT;

  7. #7
    Membre régulier

    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    90
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2009
    Messages : 90
    Points : 119
    Points
    119
    Par défaut
    Du coup, on perd la concaténation :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $lignes {$cle} .= "$cle : $ligne\n";
    non?

  8. #8
    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
    Points : 12 256
    Points
    12 256
    Billets dans le blog
    1
    Par défaut
    Compter les lignes:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    my @temp_array = split "\n", $lignes {$cle};
    my $nb_lignes = @temp_array ; # le contexte scalaire donne la taille du tableau

  9. #9
    Membre actif Avatar de brice45
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2005
    Messages
    188
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Mai 2005
    Messages : 188
    Points : 236
    Points
    236
    Par défaut
    Du coup, on perd la concaténation :
    $lignes {$cle} .= "$cle : $ligne\n";
    Non. Si tu affiches tel que :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    print FIC_OUT "$key $key2 $hash{$key}{$key2}\n";
    $key correspond à $cle
    $key2 correspond à $ligne

  10. #10
    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
    Points : 12 256
    Points
    12 256
    Billets dans le blog
    1
    Par défaut
    Autre façon de compter les lignes concaténées dans le hash:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    my $nb_lignes ++ while $lignes {$cle} =~ /\n/;

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

Discussions similaires

  1. [PDO] comptage des lignes retournées par une requête SELECT un peu complexe
    Par laurentSc dans le forum PHP & Base de données
    Réponses: 2
    Dernier message: 07/02/2015, 21h37
  2. [XL-2010] tri inversé sur des lignes d'un tableau
    Par jemigo dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 11/12/2012, 09h48
  3. Réponses: 2
    Dernier message: 26/04/2007, 10h13
  4. Tri des lignes d'une Table via Formulaire
    Par kato dans le forum Access
    Réponses: 3
    Dernier message: 19/04/2006, 12h53
  5. [VBA]comptage de lignes en fonction du contenu des cellules
    Par calimero91 dans le forum Macros et VBA Excel
    Réponses: 10
    Dernier message: 22/12/2005, 11h38

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