Newsgroup: it.comp.lang.perl
Titolo: come "riempire" una tabella

ciao,
scusate, è la prima volta che scrivo e non ne sono molto di perl
io ho un problema legato al "completamento" di una tabella
sono un elenco di record del tipo: gg/mm/aaaa hh:00 x y   (la data non è un
problema)
io ho la necessità di "riempire" le ore mancanti:
se non ho in corrispondenza di una certa ora il record di aggiungerlo
gg/mm/aaaa hh:00 0 0
per il momento ho fatto:
for ($i = 0; $i <= 23; $i++)
{
  if ($i<10)
  {
    $j = "0".$i.":00";
    $riga[$j] = "gg/mm/aaaa $j  0   0 ";
  }
  else
  {
    $j = $i.":00";
    $riga[$j] = "gg/mm/aaaa $j  0   0 ";
  }
        open(IN, "file di input");
        while (<IN>)
        {
        chomp;
        ($data,$ora,$numero,$byte) = split (" ", $_);
        if ($ora =~ /$j/)
        {
                print "esiste $j - $data $ora $numero $byte\n";
        }
        else
        {
                print " $j\n";
        }
        }
        close(IN);
   }
la parte di controllo "esiste" funziona, mentre non so come fare la parte di
riempimento
magari sto sbagliando tutto
Luca

 wrote in message
news:anf21s$8eg$1...@atlantis.cu.mi.it...

... sarebbe un buon inizio per imparare qualcosa di nuovo :-)
Leggiti perldoc -f sprintf, perché magari la parte di "riempimento" la fai
direttamente con quello. ;-)
Se poi non capisci bene, facci sapere.
Comunque in totale cosa vorresti fare? Se vuoi solo leggere da un file dei campi
data e completarli se mancanti allora fai MOLTO prima a fare:
open INP, $file or die $^E;
my $data_completa;
while (<INP>)
{
    chomp;
    $data_completa = sprintf ( .... leggiti la doc .... );
    #... fai quello che vuoi con la data completa (vuoi riscriverla nello stesso
file?)
}
ciao
Domizio

 ha scritto nel messaggio
news:anf490$duppc$1...@ID-159100.news.dfncis.de...

vado a documentarmi su sprintf
l'idea sarebbe quella di scrivere sullo stesso file di input
da:
02/10/2002 00:00          9      12166
02/10/2002 04:00          2        1199
...
a:
02/10/2002 00:00          9      12166
02/10/2002 01:00          0              0
02/10/2002 02:00          0              0
02/10/2002 03:00          0              0
02/10/2002 04:00          2        1199
....

 ....
Ma ci hai pensato bene? A me sembra proprio una cattiva idea, perché tutti i
databases cercano proprio di comprimere i dati e tu invece cerchi di espanderli.
Perché? A cosa ti serve scrivere in un file dei records intermedi a due records,
quando esiste un criterio che ti permette di creare i records mancanti al volo?
Voglio dire, che quando hai bisogno dei dati intermedi, li puoi desumere dal
record precedente e dal record successivo, senza doverli scrivere in un file.
ciao
Domizio

 ha scritto nel messaggio
news:anf7c7$dsi44$1...@ID-159100.news.dfncis.de...

condivido assolutamente la tua osservazione
è semplicemnte un problema di formato di report
l'applicazione scrive dei record solo nelle ore in cui ci sono occorrenze
ma i ragazzi del piano di sopra li vogliono con tutte le 24 ore, con degli
zeri
se non ci sono occorrenze :-(
devo aggiungere record (di zeri) in corrispondenza delle ore mancanti
Luca


... saranno perversi eh 'sti "ragazzi del piano di sopra"! E se li mandassi a
farselo loro? :-)
Comunque... non credere sia semplice come pensano loro (e magari anche tu) :-)
Tanto per cominciare devi riportare la data a un valore numerico simile a quello
che ti offre la funziona time(), al valore numerico aggiungerai il valore
numerico corrispondente all'intervallo di tempo che vuoi fra i vari records
(60*60) e ritrasformi tutto in data. Cercati in CPAN un modulo che ti piaccia
(Date::*) che lo fa per te.
Non puoi (o non dovresti anche se potessi) usare semplici valori di stringa,
perché cosa fai se hai ad esempio:
02/10/2002 00:00          9      12166
03/10/2002 04:00          2        1199
^^ notare il giorno!
Metti il tutto in un bel ciclo di while (<FILEHANDLER>) , man mano scrivi le
righe in un file temporaneo e ci aggiungi le righe che mancano, poi alla fine
cancelli il vecchio file, e cambi il nome al nuovo file.
ciao
Domizio
PS Quello che chiedi è un programma completo. In realtà qui siamo molto più
disponibili a risolverti problemi specifici, piuttosto che fare il lavoro per te
:-)

 ha scritto nel messaggio
news:anf9f2$dru51$1...@ID-159100.news.dfncis.de...

avevo intuito non fosse per nulla semplice :-)
mi studio un po' di documentazione e poi provo a produrre qualcosa;
un'ultima dritta: la strada che avevo intrapreso può andare bene o devo
ripensare completamente lo script?
Luca

 ripensare completamente lo script?
Mah... come dice il proverbio: tutte le strade portano a Roma. Il fatto è
che in programmazione di solito uno cerca la più diretta e più comoda, e non
mi sembra esattamente il caso della tua ;-). Dipende anche dalla filosofia
che utilizzi tu, quindi la decisione è completamente... "up to you".
La mia filosofia personale è: riscrivere tutto quando si scopre una strada
più breve/elegante a quello che si stava facendo, ANCHE se stava già
funzionando. Questo modus operandi implica tempo, voglia e passione per la
"perfezione", che NON SEMPRE sono disponibili, mentre SEMPRE produce
conoscenza, soddisfazione personale e... programmi ben fatti, e QUALCHE
VOLTA anche notti in bianco o tempi non rispettati :-).
La "traccia" (il termine pare sia diventato di moda) che ti ho fornito nel
mio ultimo post, è il mezzo più diretto che mi è venuto in mente al volo, ma
se scopri qualche alternativa più diretta/migliore/elegante/efficiente,
ALLORA ti esorto a sceglierla infischiandotene del mio consiglio... anzi:
prendila come motivo di orgoglio e posta qui la tua soluzione: sono sempre
contento di scoprire che c'è un sistema migliore di fare quello che stavo
già facendo anche se il sistema è stato proposto da qualcun altro.
ciao
--
-.. --- -- .. --.. .. ---
-.. . -- .. -.-. .... . .-.. .. ...