Comment puis-je vérifier la taille d'un fichier et ajouter ce résultat dans une feuille de calcul Excel en Perl?

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

  •  09-06-2019
  •  | 
  •  

Question

Actuellement, je surveille un fichier particulier avec un simple shell shell:

filesize=$(ls -lah somefile |  awk '{print $5}')

Je sais que Perl a quelques bons modules pour traiter les fichiers Excel. L’idée est donc d’exécuter cette vérification quotidiennement, peut-être avec cron, et d’écrire le résultat sur une feuille de calcul pour une utilisation statistique ultérieure.

Était-ce utile?

La solution

Vous pouvez vérifier la taille du fichier à l'aide de l'opérateur -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 moyen simple d'écrire des fichiers Excel serait d'utiliser Spreadsheet :: Write . mais si vous avez besoin de mettre à jour un fichier Excel existant, vous devriez vous pencher sur Spreadsheet :: ParseExcel .

Autres conseils

Vous pouvez utiliser l'opérateur -s pour obtenir la taille d'un fichier et le Spreadsheet :: ParseExcel et Tableur :: WriteExcel pour produire une feuille de calcul mise à jour avec les informations. Spreadsheet :: ParseExcel :: SaveParser permet de combiner facilement les deux, au cas où vous voudriez mettre à jour un fichier existant avec de nouvelles informations. Si vous utilisez Windows, vous voudrez peut-être automatiser Excel lui-même, probablement à l'aide de Win32. :: OLE .

Vous pouvez également éviter d'écrire des fichiers au format .xls et utiliser un format plus générique (mais suffisamment convivial pour Excel), tel que CSV:

#!/bin/bash
date=`date +%Y/%m/%d:%H:%M:%S`
size=$(ls -lah somefile |  awk '{print $5}')
echo "$date,$size"

Ensuite, dans votre crontab:

0 0 * * * /path/to/script.sh >/data/sizelog.csv

Vous importez ensuite ce fichier .csv dans Excel, comme toute autre feuille de calcul.

Perl a également le très beau (et très rapide ) Text :: CSV_XS vous permet de créer facilement des fichiers CSV compatibles avec Excel, ce qui peut constituer une meilleure solution que la création de fichiers XLS appropriés.

Par exemple (trop commenté pour la valeur d'instruction):

#!/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

Le module que vous devriez utiliser est Spreadsheet :: WriteExcel .

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top