Perl hash tri par valeur
Fermé
deniss92
Messages postés
39
Date d'inscription
vendredi 3 août 2007
Statut
Membre
Dernière intervention
15 septembre 2013
-
6 janv. 2009 à 14:59
deniss92 Messages postés 39 Date d'inscription vendredi 3 août 2007 Statut Membre Dernière intervention 15 septembre 2013 - 6 janv. 2009 à 20:54
deniss92 Messages postés 39 Date d'inscription vendredi 3 août 2007 Statut Membre Dernière intervention 15 septembre 2013 - 6 janv. 2009 à 20:54
A voir également:
- Perl hash tri par valeur
- Excel trier par ordre croissant chiffre - Guide
- Logiciel gratuit calcul valeur nutritionnelle - Télécharger - Santé & Bien-être
- Logiciel tri photo gratuit - Guide
- Valeur ascii - Guide
- #Valeur excel somme - Guide
15 réponses
lami20j
Messages postés
21331
Date d'inscription
jeudi 4 novembre 2004
Statut
Modérateur, Contributeur sécurité
Dernière intervention
30 octobre 2019
3 569
6 janv. 2009 à 15:13
6 janv. 2009 à 15:13
Salut,
Dans le script ci-dessous, le tri par valeur ne fonctionne pas
foreach $k (sort {$stat{$b} cmp $stat{$a}} keys %stat){
Ben c'est normal vu que tu le demandes de le faire par clés (keys %stat)
Essaie
Dans le script ci-dessous, le tri par valeur ne fonctionne pas
foreach $k (sort {$stat{$b} cmp $stat{$a}} keys %stat){
Ben c'est normal vu que tu le demandes de le faire par clés (keys %stat)
Essaie
foreach $k (sort {$stat{$b} cmp $stat{$a}} values %stat){ print RES "$k", map {",$_"} @{$stat{$k}},"\n"; }
deniss92
Messages postés
39
Date d'inscription
vendredi 3 août 2007
Statut
Membre
Dernière intervention
15 septembre 2013
1
6 janv. 2009 à 16:51
6 janv. 2009 à 16:51
bonjour lami20j
Quand je lance le script avec
foreach $k (sort {$stat{$b} <=> $stat{$a}} values %stat){
print RES "$k", map {",$_"} @{$stat{$k}},"\n";
}
j'ai le message d'erreur suivant :
Use of uninitialized value in numeric comparison (<=>) at ./top_ten.pl line 52, <FILE> line 36281.
Lorsque je mets cmp, au cas il considère cela des caractères alphanumériques, il affiche le message d'erreur
Use of uninitialized value in string comparison (cmp) at ./top_ten.pl line 52, <FILE> line 36281.
J'ai fait un test avec le script ci-dessous et ça fonctionne avec le mot clé keys :
#!/usr/bin/perl
%doc = ( "Initiation perl" , 5,
"doc perl" , 10,
"comment ça marche", 15 );
foreach $k (sort {$doc{$b} <=> $doc{$a} }
keys %doc)
{
print "$k $doc{$k}\n";
}
Il ya peut être des problèmes dans mes données.
Quand je lance le script avec
foreach $k (sort {$stat{$b} <=> $stat{$a}} values %stat){
print RES "$k", map {",$_"} @{$stat{$k}},"\n";
}
j'ai le message d'erreur suivant :
Use of uninitialized value in numeric comparison (<=>) at ./top_ten.pl line 52, <FILE> line 36281.
Lorsque je mets cmp, au cas il considère cela des caractères alphanumériques, il affiche le message d'erreur
Use of uninitialized value in string comparison (cmp) at ./top_ten.pl line 52, <FILE> line 36281.
J'ai fait un test avec le script ci-dessous et ça fonctionne avec le mot clé keys :
#!/usr/bin/perl
%doc = ( "Initiation perl" , 5,
"doc perl" , 10,
"comment ça marche", 15 );
foreach $k (sort {$doc{$b} <=> $doc{$a} }
keys %doc)
{
print "$k $doc{$k}\n";
}
Il ya peut être des problèmes dans mes données.
lami20j
Messages postés
21331
Date d'inscription
jeudi 4 novembre 2004
Statut
Modérateur, Contributeur sécurité
Dernière intervention
30 octobre 2019
3 569
6 janv. 2009 à 17:11
6 janv. 2009 à 17:11
Re,
Peux-tu mettre quelques fichiers logs sur cjoint.com pour faire un test chez moi?
Peux-tu mettre quelques fichiers logs sur cjoint.com pour faire un test chez moi?
deniss92
Messages postés
39
Date d'inscription
vendredi 3 août 2007
Statut
Membre
Dernière intervention
15 septembre 2013
1
6 janv. 2009 à 18:35
6 janv. 2009 à 18:35
https://www.cjoint.com/?bgtkXQhaiM
voici le script
#!/usr/bin/perl
# créer les indicateurs d'analyse de mois n-1
use strict;
use warnings;
use Text::Iconv;
my $converter = Text::Iconv->new("ISO-8859-1", " UTF-8");
my ($sec, $min, $heure, $jour, $mois,$annee, undef, undef, undef) = localtime();
$annee += 1900;
my (@tmp,%fields,$event,$trouve,$sujet,$k,$nombre,%stat,@dates);
#my $annee_mois='*'.$annee.$mois.'*'; # car je n'ai pas les données de janvier
my $annee_mois='*200812*';
chdir('/user/stats') || die ("Erreur chdir \n");
open RES,">/var/www/cgi-bin/data/top_ten.txt" or die "E/S : $!\n";
chomp(my @logs = glob($annee_mois));
foreach my $e(@logs){
open FILE,"$e" or warn "E/S : $!\n";
while (<FILE>){
chomp;
if ($_=~ /CONSULT\|link\|SIMPLE\|/){
$_ =~s/[\[\]]/\|/g;
@tmp=split(/\|/,$_);
$event=$tmp[0];
$trouve=$tmp[4];
$sujet=lc($tmp[6]);
$sujet= $converter->convert($sujet);
$sujet=~ s/[\?éèêë]/e/g;
$sujet=~ s/[\%\"]//g;
$sujet=~ s/\b(des|du|de|d' ?|le|la|les|l' ?)//g;#mots vides
$sujet=~ s/(\s+|\t)/ /g;# remplace trop d'espace par espace
$sujet=~ s/^\s+|\s+$//g; #suppression des espaces (debut et fin)
unless ($trouve==0){
$_=join (",",$event,$sujet) if $sujet ne "";
push @{$fields{$sujet}},$event;
}
}
}
}
foreach $sujet (sort keys %fields) {
$nombre = 0;
@dates = @{$fields{$sujet}};
foreach $event (@dates) {
$nombre++;
}
$sujet="\"".$sujet."\"";
push @{$stat{$sujet}},$nombre;
}
foreach $k (sort {$stat{$b} <=> $stat{$a}} values %stat){
print RES "$k", map {",$_"} @{$stat{$k}},"\n";
}
voici le script
#!/usr/bin/perl
# créer les indicateurs d'analyse de mois n-1
use strict;
use warnings;
use Text::Iconv;
my $converter = Text::Iconv->new("ISO-8859-1", " UTF-8");
my ($sec, $min, $heure, $jour, $mois,$annee, undef, undef, undef) = localtime();
$annee += 1900;
my (@tmp,%fields,$event,$trouve,$sujet,$k,$nombre,%stat,@dates);
#my $annee_mois='*'.$annee.$mois.'*'; # car je n'ai pas les données de janvier
my $annee_mois='*200812*';
chdir('/user/stats') || die ("Erreur chdir \n");
open RES,">/var/www/cgi-bin/data/top_ten.txt" or die "E/S : $!\n";
chomp(my @logs = glob($annee_mois));
foreach my $e(@logs){
open FILE,"$e" or warn "E/S : $!\n";
while (<FILE>){
chomp;
if ($_=~ /CONSULT\|link\|SIMPLE\|/){
$_ =~s/[\[\]]/\|/g;
@tmp=split(/\|/,$_);
$event=$tmp[0];
$trouve=$tmp[4];
$sujet=lc($tmp[6]);
$sujet= $converter->convert($sujet);
$sujet=~ s/[\?éèêë]/e/g;
$sujet=~ s/[\%\"]//g;
$sujet=~ s/\b(des|du|de|d' ?|le|la|les|l' ?)//g;#mots vides
$sujet=~ s/(\s+|\t)/ /g;# remplace trop d'espace par espace
$sujet=~ s/^\s+|\s+$//g; #suppression des espaces (debut et fin)
unless ($trouve==0){
$_=join (",",$event,$sujet) if $sujet ne "";
push @{$fields{$sujet}},$event;
}
}
}
}
foreach $sujet (sort keys %fields) {
$nombre = 0;
@dates = @{$fields{$sujet}};
foreach $event (@dates) {
$nombre++;
}
$sujet="\"".$sujet."\"";
push @{$stat{$sujet}},$nombre;
}
foreach $k (sort {$stat{$b} <=> $stat{$a}} values %stat){
print RES "$k", map {",$_"} @{$stat{$k}},"\n";
}
deniss92
Messages postés
39
Date d'inscription
vendredi 3 août 2007
Statut
Membre
Dernière intervention
15 septembre 2013
1
6 janv. 2009 à 17:35
6 janv. 2009 à 17:35
Ok,
Je vais les déposer. Je dépose aussi le script tel que, car je l'ai légèrement modifier ici.
A bientot
Merci
Je vais les déposer. Je dépose aussi le script tel que, car je l'ai légèrement modifier ici.
A bientot
Merci
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
lami20j
Messages postés
21331
Date d'inscription
jeudi 4 novembre 2004
Statut
Modérateur, Contributeur sécurité
Dernière intervention
30 octobre 2019
3 569
6 janv. 2009 à 20:05
6 janv. 2009 à 20:05
Re,
Je pense qu'il sera plus facile si tu me dis quel champ tu veux récupérer et compter.
Déjà je vois que seulement les lignes qui content |CONSULT|link|SIMPLE| t'intéresse
Je vois aussi qu'une séparation est faite avec |
Par exemple sur celle ligne
20081211123923|CONSULT|link|SIMPLE|260| PERSONNES.DPERS_DESYN and [de gaulle%] bool_and THES_GEO.DTHGEO_DESYN and [de gaulle%] bool_or THES_RAMEAU.DTHRAM_DESYN and [de gaulle%] bool_or NOTICES.DNOT_MOTS and
Quelle champ tu comptes?
Je pense qu'il sera plus facile si tu me dis quel champ tu veux récupérer et compter.
Déjà je vois que seulement les lignes qui content |CONSULT|link|SIMPLE| t'intéresse
Je vois aussi qu'une séparation est faite avec |
Par exemple sur celle ligne
20081211123923|CONSULT|link|SIMPLE|260| PERSONNES.DPERS_DESYN and [de gaulle%] bool_and THES_GEO.DTHGEO_DESYN and [de gaulle%] bool_or THES_RAMEAU.DTHRAM_DESYN and [de gaulle%] bool_or NOTICES.DNOT_MOTS and
Quelle champ tu comptes?
deniss92
Messages postés
39
Date d'inscription
vendredi 3 août 2007
Statut
Membre
Dernière intervention
15 septembre 2013
1
6 janv. 2009 à 20:13
6 janv. 2009 à 20:13
Je compte le premier champ entre crochet. Par exemple [de gaulle]. Et je ne prends pas les autres champs entre crochet, c'est la même chose tout le temps pour une requête. Par ailleurs, je ne compte que si je champ qui suit le champ SIMPLE est supérieur à 0. Par exemple SIMPLE|260|
lami20j
Messages postés
21331
Date d'inscription
jeudi 4 novembre 2004
Statut
Modérateur, Contributeur sécurité
Dernière intervention
30 octobre 2019
3 569
6 janv. 2009 à 20:16
6 janv. 2009 à 20:16
Re,
Si je comprends bien tu compte 3 fois [de gaulle]
ensuite tu as 3 fois [france allemagne]
20081211015850|CONSULT|link|SIMPLE|397| PERSONNES.DPERS_DESYN and [france allemagne%] bool_and THES_GEO.DTHGEO_DESYN and [france allemagne%] bool_or THES_RAMEAU.DTHRAM_DESYN and [france allemagne%] bool_or N
et ainsi de suite et la fin de veux affiche les 10 groupes avec un nombre d'apparitions plus grandes?
Si je comprends bien tu compte 3 fois [de gaulle]
ensuite tu as 3 fois [france allemagne]
20081211015850|CONSULT|link|SIMPLE|397| PERSONNES.DPERS_DESYN and [france allemagne%] bool_and THES_GEO.DTHGEO_DESYN and [france allemagne%] bool_or THES_RAMEAU.DTHRAM_DESYN and [france allemagne%] bool_or N
et ainsi de suite et la fin de veux affiche les 10 groupes avec un nombre d'apparitions plus grandes?
deniss92
Messages postés
39
Date d'inscription
vendredi 3 août 2007
Statut
Membre
Dernière intervention
15 septembre 2013
1
6 janv. 2009 à 20:20
6 janv. 2009 à 20:20
C'est bien ça. C'est pour faire un top ten.
Je ne compte qu'une fois par date. Le premier champ représente la date (et heure+minute..)
Je ne compte qu'une fois par date. Le premier champ représente la date (et heure+minute..)
lami20j
Messages postés
21331
Date d'inscription
jeudi 4 novembre 2004
Statut
Modérateur, Contributeur sécurité
Dernière intervention
30 octobre 2019
3 569
6 janv. 2009 à 20:24
6 janv. 2009 à 20:24
Re,
Je ne compte qu'une fois par date.
La phrase qui tue. Je ne comprends pas.
Je ne compte qu'une fois par date.
La phrase qui tue. Je ne comprends pas.
lami20j
Messages postés
21331
Date d'inscription
jeudi 4 novembre 2004
Statut
Modérateur, Contributeur sécurité
Dernière intervention
30 octobre 2019
3 569
6 janv. 2009 à 20:27
6 janv. 2009 à 20:27
Re,
Ca veut dire que par exemple ici
20081230221213|CONSULT|link|SIMPLE|293| PERSONNES.DPERS_DESYN and ["historique" "REGIMENT%"] bool_and THES_GEO.DTHGEO_DESYN and ["historique" "REGIMENT%"] bool_or THES_RAMEAU.DTHRAM_DESYN and ["historique" "
20081230221331|CONSULT|link|SIMPLE|293| PERSONNES.DPERS_DESYN and ["historique" "REGIMENT%"] bool_and THES_GEO.DTHGEO_DESYN and ["historique" "REGIMENT%"] bool_or THES_RAMEAU.DTHRAM_DESYN and ["historique" "
Tu vas compter une seule fois ["historique" "REGIMENT%"] (la date est la même, c'est l'heure qui est différente)?
Ca veut dire que par exemple ici
20081230221213|CONSULT|link|SIMPLE|293| PERSONNES.DPERS_DESYN and ["historique" "REGIMENT%"] bool_and THES_GEO.DTHGEO_DESYN and ["historique" "REGIMENT%"] bool_or THES_RAMEAU.DTHRAM_DESYN and ["historique" "
20081230221331|CONSULT|link|SIMPLE|293| PERSONNES.DPERS_DESYN and ["historique" "REGIMENT%"] bool_and THES_GEO.DTHGEO_DESYN and ["historique" "REGIMENT%"] bool_or THES_RAMEAU.DTHRAM_DESYN and ["historique" "
Tu vas compter une seule fois ["historique" "REGIMENT%"] (la date est la même, c'est l'heure qui est différente)?
deniss92
Messages postés
39
Date d'inscription
vendredi 3 août 2007
Statut
Membre
Dernière intervention
15 septembre 2013
1
6 janv. 2009 à 20:33
6 janv. 2009 à 20:33
Prenons l'exemple suivant :
20081211015850|CONSULT|link|SIMPLE|397| PERSONNES.DPERS_DESYN and [france allemagne%] bool_and THES_GEO.DTHGEO_DESYN and [france allemagne%] bool_or THES_RAMEAU.DTHRAM_DESYN and [france allemagne%] bool_or N
Le premier champ est 20081211015850, il faut lire annee 2008, 12 pour décembre, 11 pour le jour et le reste représente l'heure, minute, seconde. Une nouvelle ne commence qu'avec une date. Par conséquent, l'exemple ci-dessus est une requete donc, je ne compte [de gaulle%] qu'une fois. Dans mon script, c'est le fields[6], après avoir remplacer les "[ ]" par "|"
20081211015850|CONSULT|link|SIMPLE|397| PERSONNES.DPERS_DESYN and [france allemagne%] bool_and THES_GEO.DTHGEO_DESYN and [france allemagne%] bool_or THES_RAMEAU.DTHRAM_DESYN and [france allemagne%] bool_or N
Le premier champ est 20081211015850, il faut lire annee 2008, 12 pour décembre, 11 pour le jour et le reste représente l'heure, minute, seconde. Une nouvelle ne commence qu'avec une date. Par conséquent, l'exemple ci-dessus est une requete donc, je ne compte [de gaulle%] qu'une fois. Dans mon script, c'est le fields[6], après avoir remplacer les "[ ]" par "|"
lami20j
Messages postés
21331
Date d'inscription
jeudi 4 novembre 2004
Statut
Modérateur, Contributeur sécurité
Dernière intervention
30 octobre 2019
3 569
6 janv. 2009 à 20:38
6 janv. 2009 à 20:38
Re,
Ok, donc le champ tu le compte une seule fois pas 3 d'accord.
Pour les dates j'ai bien compris.
Ma question est : Si tu as deux lignes avec la même date (je ne parle pas des heures, min ,sec) tu comptes toujours ou pas?
Ok, donc le champ tu le compte une seule fois pas 3 d'accord.
Pour les dates j'ai bien compris.
Ma question est : Si tu as deux lignes avec la même date (je ne parle pas des heures, min ,sec) tu comptes toujours ou pas?
deniss92
Messages postés
39
Date d'inscription
vendredi 3 août 2007
Statut
Membre
Dernière intervention
15 septembre 2013
1
6 janv. 2009 à 20:41
6 janv. 2009 à 20:41
Les utilisateurs se connectent avec le même compte. Autrement dit, en 1 heure une dizaine d'utilsateur peuvent se connecte avec le même compte. Donc il faut prendre en compte les heures. Par conséquent, il compter même quand l'heure change. Si toi et moi, on le compte toto, je lance une requête 20h10 et toi a 20h20, il faut compter deux requêtes.
lami20j
Messages postés
21331
Date d'inscription
jeudi 4 novembre 2004
Statut
Modérateur, Contributeur sécurité
Dernière intervention
30 octobre 2019
3 569
6 janv. 2009 à 20:44
6 janv. 2009 à 20:44
Re,
Ben, je ne comprends pas ;-((
Ben, je ne comprends pas ;-((
deniss92
Messages postés
39
Date d'inscription
vendredi 3 août 2007
Statut
Membre
Dernière intervention
15 septembre 2013
1
6 janv. 2009 à 20:54
6 janv. 2009 à 20:54
Dans l'exemple ci-dessous (qui est rare et je suis d'accord avec toi).
20081230221213|CONSULT|link|SIMPLE|293| PERSONNES.DPERS_DESYN and ["historique" "REGIMENT%"] bool_and THES_GEO.DTHGEO_DESYN and ["historique" "REGIMENT%"] bool_or THES_RAMEAU.DTHRAM_DESYN and ["historique" "
20081230221331|CONSULT|link|SIMPLE|293| PERSONNES.DPERS_DESYN and ["historique" "REGIMENT%"] bool_and THES_GEO.DTHGEO_DESYN and ["historique" "REGIMENT%"] bool_or THES_RAMEAU.DTHRAM_DESYN and ["historique" "
Pourquoi le meme utilisateur, relancerait-il la meme requête en 2 minutes à peine ? car la valeur 293 signifie qu'il à trouvé quelques choses !
20081230221213|CONSULT|link|SIMPLE|293| PERSONNES.DPERS_DESYN and ["historique" "REGIMENT%"] bool_and THES_GEO.DTHGEO_DESYN and ["historique" "REGIMENT%"] bool_or THES_RAMEAU.DTHRAM_DESYN and ["historique" "
20081230221331|CONSULT|link|SIMPLE|293| PERSONNES.DPERS_DESYN and ["historique" "REGIMENT%"] bool_and THES_GEO.DTHGEO_DESYN and ["historique" "REGIMENT%"] bool_or THES_RAMEAU.DTHRAM_DESYN and ["historique" "
Pourquoi le meme utilisateur, relancerait-il la meme requête en 2 minutes à peine ? car la valeur 293 signifie qu'il à trouvé quelques choses !