2

現在、単純なシェルワンライナーで特定のファイルを監視しています:

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

PerlにはExcelファイルを処理するための優れたモジュールがあることを知っているので、たとえば、おそらくcronを使用してそのチェックを毎日実行し、結果をスプレッドシートに書き込んでさらに統計的に使用するという考えです。

4

5 に答える 5

8

演算子を使用-sてファイルのサイズを取得し、Spreadsheet::ParseExcelおよびSpreadsheet::WriteExcelモジュールを使用して、情報を含む更新されたスプレッドシートを生成できます。Spreadsheet::ParseExcel::SaveParserを使用すると、既存のファイルを新しい情報で更新する場合に備えて、2 つを簡単に組み合わせることができます。Windows を使用している場合は、おそらくWin32::OLEを使用して、代わりに Excel 自体を自動化したい場合があります。

于 2008-09-16T12:23:00.377 に答える
7

-s 演算子を使用して、ファイルのサイズを確認できます。

厳密に使用します。
警告を使用します。

File::Slurp qw(read_file write_file); を使用します。
Spreadsheet::ParseExcel を使用します。
Spreadsheet::ParseExcel::SaveParser を使用します。
Spreadsheet::WriteExcel を使用します。

私の $file = 'path_to_file';
my $size_file = 'path_to_file_keeping_the_size';
my $excel_file = 'path_to_excel_file.xls';

私の $current_size = -s $file;
私の $old_size = 0;
if (-e $size_file) {
   $old_size = read_file($size_file);
}

if ($old_size new;
        my $excel = $parser->Parse($excel_file);
        私の $row = 1;
        $row++ while $excel->{Worksheet}[0]->{Cells}[$row][0];
        $excel->AddCell(0, $row, 0, scalar(localtime));
        $excel->AddCell(0, $row, 1, $current_size);

        私の $workbook = $excel->SaveAs($excel_file);
        $workbook->close;

    } そうしないと {
        my $workbook = Spreadsheet::WriteExcel->new($excel_file);
        私の $worksheet = $workbook->add_worksheet();
        $worksheet->write(0, 0, '日付');
        $worksheet->write(0, 1, 'サイズ');

        $worksheet->write(1, 0, スカラー(現地時間));
        $worksheet->write(1, 1, $current_size);
        $workbook->close;
    }
}

write_file($size_file, $current_size);

Excel ファイルを書き込む簡単な方法は、 Spreadsheet::Writeを使用することです。ただし、既存の Excel ファイルを更新する必要がある場合は、 Spreadsheet::ParseExcelを調べる必要があります。

于 2008-09-16T12:29:18.923 に答える
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
于 2008-09-16T14:25:08.600 に答える
4

また、.x​​ls 形式のファイルを作成する手間を省き、CSV などのより一般的な (しかし十分に Excel に適した) 形式を使用することもできます。

#!/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 にインポートします。

于 2008-09-16T13:35:17.377 に答える
2

使用するモジュールはSpreadsheet::WriteExcelです。

于 2008-09-16T12:24:03.307 に答える