Come posso verificare la dimensione di un file e aggiungere il risultato in un foglio di calcolo Excel in Perl?

StackOverflow https://stackoverflow.com/questions/71643

  •  09-06-2019
  •  | 
  •  

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.

È stato utile?

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top