2008-09-16 8 views
1

Actuellement, je suivi un fichier particulier avec une coque simple-liner:Comment puis-je vérifier la taille d'un fichier et ajouter ce résultat dans une feuille de calcul Excel en Perl?

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

Je suis conscient que Perl a quelques modules agréables pour traiter les fichiers Excel si l'idée est de, disons, exécutez que l'enregistrement tous les jours, peut-être avec cron, et écrire le résultat sur une feuille de calcul pour un usage statistique supplémentaire.

+0

Quelle est votre question exactement? –

+0

Je pense que la question est, pouvez-vous s'il vous plaît faire cela pour moi? : D –

Répondre

6

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); 

Une façon simple d'écrire des fichiers Excel serait utilise Spreadsheet::Write. mais si vous avez besoin de mettre à jour un fichier Excel existant, vous devriez regarder dans Spreadsheet::ParseExcel.

+0

Je pense que je devrais faire les deux, d'abord créer la feuille de calcul puis la mettre à jour quotidiennement avec la nouvelle taille. Puis-je vous demander comment pourrais-je traiter ces modules en principe si je ne suis pas l'administrateur UNIX et que je ne peux pas en installer de nouveaux? –

+0

Peut-être que c'est plus facile de créer un fichier CSV. Ceux-ci peuvent être chargés par Excel et sont faciles à générer en utilisant Perl sans modules supplémentaires. –

8

Vous pouvez utiliser the -s operator pour obtenir la taille d'un fichier et les modules Spreadsheet::ParseExcel et Spreadsheet::WriteExcel pour produire une feuille de calcul mise à jour avec les informations. Spreadsheet::ParseExcel::SaveParser vous permet de combiner facilement les deux, au cas où vous souhaitez mettre à jour un fichier existant avec de nouvelles informations. Si vous êtes sur Windows, vous pouvez vouloir automatiser Excel lui-même à la place, probablement avec l'aide de Win32::OLE.

3

Vous pouvez aussi sauter les tracas de fichiers au format écrit .xls et utiliser un format plus générique (mais avec Excel suffisamment) au format 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 

Ensuite, vous importez ce fichier .csv dans Excel comme n'importe quelle autre feuille de calcul.

+0

Comment est-ce que je pourrais enlever la grandeur "M" de la variable ainsi je l'emploierais pour des comparaisons, par exemple. "if [$ size -gt 500] then" –

+0

Nano: l'argument "-h" de ls est ce qui le met au format K/M/G. Changer le "ls -lah" en "ls -la" listerait la taille en octets sans une magnitude. –

3

Perl a aussi la très belle (et très rapide ) Text::CSV_XS qui vous permet de faire facilement des fichiers CSV avec Excel, ce qui peut être une meilleure solution que la création de fichiers XLS appropriés.

Par exemple (sur la valeur pédagogique a commenté):

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

L'une des bonnes choses à propos de cette approche est la sortie est lisible par l'homme. –

Questions connexes