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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé

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

    Informations forums :
    Inscription : Janvier 2009
    Messages : 90
    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
    Billets dans le blog
    1
    Par défaut
    Utilise un hash et concatène les lignes dans le hash.

  3. #3
    Membre confirmé

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

    Informations forums :
    Inscription : Janvier 2009
    Messages : 90
    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 expérimenté 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
    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 confirmé

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

    Informations forums :
    Inscription : Janvier 2009
    Messages : 90
    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 expérimenté 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
    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;

+ 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, 22h37
  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, 10h48
  3. Réponses: 2
    Dernier message: 26/04/2007, 11h13
  4. Tri des lignes d'une Table via Formulaire
    Par kato dans le forum Access
    Réponses: 3
    Dernier message: 19/04/2006, 13h53
  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, 12h38

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