giovedì 28 aprile 2016

Perl - leggere tutti i file di una directory e scriverne il contenuto su file


Oggi niente Java, oggi perl. (Si non vi preoccupate l'ho fatto anche in java, solo che mi ispirava farlo anche in perl, visto che manipolare file e' la sua specialita' per cui vi propongo prima questo e poi quello).

La richiesta e' questa: leggere un x numero di files (non specificato) la cui estensione non e' nota e buttare tutto su un unico file. Inoltre e' richiesto di non metterci troppo tempo negli sviluppi e non c'e' richiesta di raffinatezze grafiche o robe cosi' (aka seghe mentali).

Di conseguenza ho deciso di ignorare totalmente l'input utente, lo script prende in considerazione la directory dalla quale viene eseguito, legge tutti i file ad eccezione di quelli che finiscono in jar, log, perl e che cominciano per "mergedFile" (che e' quello di output) e scrive tutto in un file che si chiama mergedFile_data(ora).txt. Inoltre produce un file che si chiama mergedFileLog_data(ora).log dove scrive i vari file letti (giusto per avere un riscontro di averli letti tutti)


Un po' di dettagli:

use Cwd; Cwd e' una libreria per ottenere il path corrente e poi lo infilo in $dir my $dir = getcwd

@months = qw( Gen Feb Mar Apr MaG Giu Log Ago Set Ott Nov Dic ); creo un array col nome dei mesi nel mio caso in italiano... my ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime(); inizializzo un po'di variabili da localtime

my $file_to_write = "mergedFile_$year$months[$mon]$mday($hour$min).txt"; my $log_to_write = "mergedFileLog_$year$months[$mon]$mday($hour$min).log"; creo altre due variabili una per il file da scrivere e una per il log

#apro la directory da leggere opendir(DIR, $dir) or die $!; #apro il file da scrivere (in append) open(my $fh, '>>', $file_to_write) or die "Could not open file '$file_to_write' $!"; #apro il log da scrivere (sempre in append) open(my $log, '>>', $log_to_write) or die "Could not open file '$log_to_write' $!"; apro il tutto (o muori)

nel doppio ciclo scansiono la directory corrente per ogni file while (my $file = readdir(DIR))
salto se non e' un file next unless (-f "$dir/$file");
salto se inizia per mergedFile o finisce per jar, log o pl
next if ($file =~ m/^\mergedFile/ || $file =~ m/\.jar/ || $file =~ m/\.log/ || $file =~ m/\.pl/);

scrivo sul log il file che sto leggendo e lo apro say $log "leggendo: $file\n"; open (INPUT, $file) || next print "can't open $file: $!";

while (< INPUT >) { chomp; # appendo $_ sul file say $fh "$_"; } leggo il file e lo scrivo sull'altro

Se vi interessa eseguire perl:

  • Su linux e' nativo
  • Su windows potete scaricare strawberry perl da qui

Se vi interessa un editor perl (oltre a npp o gedit che vanno benissimo) potete usare PADRE

Nessun commento:

Posta un commento

I messaggi non appaiono subito ma a seguito dell'approvazione di un moderatore. Siete pregati di seguire le seguenti regole