Newsgroup: it.comp.lang.perl
Titolo: statistiche su date

Salve a tutti. Piu` che un novizio sono un beota del perl. Comunque
l'ho trovato comodo per risolvere il seguente problema.
dato un file contenente N righe con la seguente struttura
IP | non inerente al problema  | numeri_processati | data & ora
volevo sapere per ciascun IP distino che compare nel file
quanti numeri esso ha processato e quanti numeri sono stati processati
in un determinato arco di tempo (vorrei fare delle statistiche divise
per ora, giorno, settimana, ecc... un po` come fa hhtp-analyze con gli
accessi ad un server web per intenderci)
Ho letto un po` le man-pages, visto qualche esempio e sono rimasto
impressionato che la prima parte di problema puo` essere risolta con
due righe:
while (<FD>> {
 splittamento
$totale{$campo[0]} += $campo[2];
}
Tra l'altro volevo chiedervi: immagino che non sia un metodo efficiente,
oppure si?
Si puo` fare qualcosa di simile con le date? Mettere i totali in un hash
i cui indici sono in qulche modo collegabili ad un intervallo temporale?
Spero possiate darmi qualche suggerimento, magari anche del tipo il perl
non e` fatto per 'ste cose.
Grazie mille.
-- 
Enrico Cavalli              | Statisticians probably do it. 
via Falcone, 11             | Algebraists do it in groups.
Pozzo d'Adda (MI)           | (Logicians do it) or [not (logicians do it)].
email: 
ebca...@iol.it
     | M\"obius always did it on the same side.

 
Perl e' fatto esattamente per questo tipo di cose.
Cheers,
	Alessandro Forghieri

 Certo che si'.  
Magari mi sai dare qualche consiglio su moduli per gestire le date?
Il fatto e` che io non so proprio nulla di perl.
Avevo letto di Date::Manip in un thread su questo ng e si diceva che era
pesante. In effetti solo a parsare la data ci mette una vita.
Nella man page parla di una feature non ancora presente: la possibilita`
di comparare due date sulla base di una granularita` a scelta (ora,
giorno, ecc) . Questo sarebbe veramente comodo.
Grazie e ciao.


 pesante. In effetti solo a parsare la data ci mette una vita.
Anche qui dipende da quello che devi fare con le date. Io non ho mai
usato Date::Manip,
quindi non so dire. Per cose come confronti, etc. dovrebbe bastare
convertire la data
in secondi - il modulo Posix (che non e' una piuma) contiene funzioni
come timelocal,
etc. che servono a questo scopo.
Se puoi fare assunzioni sul formato della data, e non devi fare
aritmetica sulle date, forse non ti serve la generalita' di un modulo
data, e.g:
($wday, $day, $month, $year, $junk) = split(/\s+/,$datefield);
$histo{"$day,$wday,$month,$year"}=$data;
basta se gia' sai che tutte le tue date sono in formato "Mon 17 March
2023 11:21:32 PM".
Cheers,
	Alessandro

 data, e.g:
Hai ragione: le mie date sono proprio in formato fisso ed e` banale
risalire al mese, giorno ed ora di interesse.
Devo ancora studiarmi il discorso delle timezone, non ho ancora letto
nulla al riguardo. Ci sara` comunque qualcosa che converte in tempo
universale...  bene mi metto sotto a studiare.
Grazie ancora per l'aiuto e i consigli: ora mi hai convinto di essere
sulla strada giusta e soprattutto la chiacchierata mi ha un po` schiarito
le idee.
Ciao. 


 wrote:
: dato un file contenente N righe con la seguente struttura
: IP | non inerente al problema  | numeri_processati | data & ora
: volevo sapere per ciascun IP distino che compare nel file
: quanti numeri esso ha processato e quanti numeri sono stati processati
: in un determinato arco di tempo (vorrei fare delle statistiche divise
: per ora, giorno, settimana, ecc... un po` come fa hhtp-analyze con gli
: accessi ad un server web per intenderci)
Alla prima domanda hai risposto da solo, per seconda potresti usare
sempre un hash con chiave l'IP e con valore un reference ad un hash
che ha come chiavi data e ora e come valori i numeri processati.
Ovviamente prima ti conviene convertire data & ora in un formato meno
umano :-) codificando il tutto in termini di secondi.
Dai un'occhiata ai moduli per il parsing di date (prova in un sito
del CPAN, ad esempio 
ftp://cis.utovrm.it/CPAN/modules/by-module/Date/
)
e troverai sicuramente il modulo Date::Parse che puo` fare al caso
tuo.
In caso tu non sia pratico di references e amenita` del genere basta
un 'man perlref' per saperne di piu`. Per informazioni su come si
costruiscono strutture dati complesse consulta le man pages perldsc e
perllol.
In pratica, una volta suddivisi i campi e convertite le date, puoi
fare una cosa del genere:
while(<>){                             # Costruisce la struttura dati
	chomp;
	@campo = split /\|/;
	$dati{$campo[0]}->{$campo[3]} =  $campo[2];
}
for $ip (keys %dati){                  # La stampa
	for $ora (keys %{$dati{$ip}}){
		print "$ip $ora: $dati{$ip}->{$ora}\n";
	}
}
Io l'ho provato con un file di dati cosi`:
192.168.1.1|ggg|12|12
192.168.1.1|ggg|2|14
192.168.1.1|ggg|5|16
192.168.1.2|ggg|5|16
Ovviamente tu avrai le date in un tuo formato e vorrai fare cose piu`
complesse di una stampa :-)
: Tra l'altro volevo chiedervi: immagino che non sia un metodo efficiente,
: oppure si?
Efficiente per il processore o per il programmatore?
Di quanti gigabytes e` il tuo file e quanto costa il tuo tempo?
Comunque le hash tables del Perl sono abbastanza ottimizzate...
-- 
Nando Santagata: Telemastica & infornatica
Key fingerprint = C2 D9 C0 8E D5 B7 04 97  AF E8 3F 3E AF 4E 7F 9E

 Di quanti gigabytes e` il tuo file e quanto costa il tuo tempo?
No no... non siamo su quegli ordini di grandezza fortunatamente.
Certo che ho visto pasticciando con il modulo GIFgraph un core di ~9MB.
Significa che e` abbastanza esoso il perl oppure il modulo grafico,
perche` a questo punto mi rifuto di credere che lo siano i miei conti.
Per il programmatore (chi io?) e` certamente efficiente come numero di
linee di codice e come impatto visivo dei risultati.
Grazie mille per la tua risposta e per lo stralcio di codice.
