Как я могу проверить размер файла и добавить этот результат в электронную таблицу Excel на Perl?

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

  •  09-06-2019
  •  | 
  •  

Вопрос

В настоящее время я отслеживаю конкретный файл с помощью простой однострочной оболочки:

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

Я знаю, что в Perl есть несколько хороших модулей для работы с файлами Excel, поэтому идея состоит в том, чтобы, скажем, запускать эту проверку ежедневно, возможно, с помощью cron, и записывать результат в электронную таблицу для дальнейшего статистического использования.

Это было полезно?

Решение

Вы можете проверить размер файла с помощью оператора -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 было бы использование Электронная таблица::Запись.но если вам нужно обновить существующий файл Excel, вам следует заглянуть в Электронная таблица::ParseExcel.

Другие советы

Вы можете использовать тот самый -s оператор чтобы получить размер файла и Электронная таблица::ParseExcel и Электронная таблица::WriteExcel модули для создания обновленной электронной таблицы с этой информацией. Электронная таблица::ParseExcel::SaveParser позволяет вам легко комбинировать их на случай, если вы захотите обновить существующий файл новой информацией.Если вы работаете в Windows, возможно, вам захочется автоматизировать сам Excel, возможно, с помощью Win32::OLE.

Вы также можете отказаться от необходимости писать файлы в формате .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 точно так же, как любую другую электронную таблицу.

Perl также имеет очень приятный (и очень быстро) Текст::CSV_XS это позволяет вам легко создавать CSV-файлы, удобные для Excel, что может быть лучшим решением, чем создание надлежащих 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

Модуль, который вы должны использовать, - это Электронная таблица::WriteExcel.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top