如何检查文件大小并将该结果添加到Perl中的Excel电子表格中?

时间:2008-09-16 12:18:13

标签: perl unix shell ksh

目前我使用简单的shell one-liner监视特定文件:

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

我知道Perl有一些很好的模块可以处理Excel文件所以我们的想法就是每天运行那个检查,也许是用cron,然后将结果写在电子表格上以供进一步统计使用。

5 个答案:

答案 0 :(得分:8)

您可以使用the -s operator获取文件的大小以及Spreadsheet::ParseExcelSpreadsheet::WriteExcel模块,以生成包含该信息的更新电子表格。如果您想使用新信息更新现有文件,Spreadsheet::ParseExcel::SaveParser可让您轻松组合这两者。如果您使用的是Windows,则可能需要自动执行Excel本身,可能需要Win32::OLE的帮助。

答案 1 :(得分:7)

您可以使用-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);

编写Excel文件的简单方法就是使用 Spreadsheet::Write。 但如果您需要更新现有的Excel文件,则应该查看 Spreadsheet::ParseExcel

答案 2 :(得分:4)

您还可以省去编写.xls格式文件的麻烦,并使用更通用(但足够Excel友好)的格式,例如CSV:

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

然后,在你的crontab中:

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

然后将.csv文件导入Excel,就像任何其他电子表格一样。

答案 3 :(得分:4)

Perl还有非常好的(非常快速Text::CSV_XS,它允许您轻松制作Excel友好的CSV文件,这可能是比创建正确的XLS文件更好的解决方案。

例如(对教学价值进行过度评论):

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

答案 4 :(得分:2)

您应该使用的模块是Spreadsheet::WriteExcel