Come posso verificare la dimensione di un file e aggiungere il risultato in un foglio di calcolo Excel in Perl?
Domanda
Attualmente sto monitorando un particolare file con un semplice one-liner della shell:
filesize=$(ls -lah somefile | awk '{print $5}')
Sono consapevole che Perl ha alcuni moduli interessanti per gestire i file Excel, quindi l'idea è, diciamo, di eseguire quel controllo quotidianamente, magari con cron, e scrivere il risultato su un foglio di calcolo per ulteriori usi statistici.
Soluzione
Puoi controllare la dimensione del file usando l'operatore -s.
use strict; use warnings; use File::Slurp qw(read_file write_file); use Spreadsheet::ParseExcel; use Spreadsheet::ParseExcel::SaveParser; use Spreadsheet::WriteExcel; my $file = 'path_to_file'; my $size_file = 'path_to_file_keeping_the_size'; my $excel_file = 'path_to_excel_file.xls'; my $current_size = -s $file; my $old_size = 0; if (-e $size_file) { $old_size = read_file($size_file); } if ($old_size new; my $excel = $parser->Parse($excel_file); my $row = 1; $row++ while $excel->{Worksheet}[0]->{Cells}[$row][0]; $excel->AddCell(0, $row, 0, scalar(localtime)); $excel->AddCell(0, $row, 1, $current_size); my $workbook = $excel->SaveAs($excel_file); $workbook->close; } else { my $workbook = Spreadsheet::WriteExcel->new($excel_file); my $worksheet = $workbook->add_worksheet(); $worksheet->write(0, 0, 'Date'); $worksheet->write(0, 1, 'Size'); $worksheet->write(1, 0, scalar(localtime)); $worksheet->write(1, 1, $current_size); $workbook->close; } } write_file($size_file, $current_size);
Un modo semplice per scrivere file Excel sarebbe utilizzareFoglio di calcolo::Scrivi.ma se hai bisogno di aggiornare un file Excel esistente dovresti esaminarloFoglio di calcolo::ParseExcel.
Altri suggerimenti
Puoi usare IL -s
operatore per ottenere la dimensione di un file e il file Foglio di calcolo::ParseExcel E Foglio di calcolo::WriteExcel moduli per produrre un foglio di calcolo aggiornato con le informazioni. Foglio di calcolo::ParseExcel::SaveParser ti consente di combinare facilmente i due, nel caso in cui desideri aggiornare un file esistente con nuove informazioni.Se utilizzi Windows, potresti invece voler automatizzare Excel stesso, probabilmente con l'aiuto di Win32::OLE.
Puoi anche evitare il fastidio di scrivere file in formato .xls e utilizzare un formato più generico (ma sufficientemente compatibile con Excel) come CSV:
#!/bin/bash
date=`date +%Y/%m/%d:%H:%M:%S`
size=$(ls -lah somefile | awk '{print $5}')
echo "$date,$size"
Quindi, nel tuo crontab:
0 0 * * * /path/to/script.sh >/data/sizelog.csv
Quindi importi il file .csv in Excel proprio come qualsiasi altro foglio di calcolo.
Perl ha anche il bellissimo (e molto veloce) Testo::CSV_XS che ti consente di creare facilmente file CSV compatibili con Excel, che potrebbe essere una soluzione migliore rispetto alla creazione di file XLS adeguati.
Ad esempio (eccessivo commento per valore didattico):
#!/usr/bin/perl
package main;
use strict; use warnings; # always!
use Text::CSV_XS;
use IO::File;
# set up the CSV file
my $csv = Text::CSV_XS->new( {eol=>"\r\n"} );
my $io = IO::File->new( 'report.csv', '>')
or die "Cannot create report.csv: $!\n";
# for each file specified on command line
for my $file (@ARGV) {
unless ( -f $file ) {
# file doesn't exist
warn "$file doesn't exist, skipping\n";
next;
}
# get its size
my $size = -s $file;
# write the filename and size to a row in CSV
$csv->print( $io, [ $file, $size ] );
}
$io->close; # make sure CSV file is flushed and closed
Il modulo che dovresti utilizzare è Foglio di calcolo::WriteExcel.