Wie kann ich für eine Dateigröße überprüfen und dieses Ergebnis in einer Excel-Tabelle in Perl hinzufügen?

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

  •  09-06-2019
  •  | 
  •  

Frage

Zur Zeit Überwachung ich eine bestimmte Datei mit einem einfachen Shell-Einzeiler:

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

Ich bin mir bewusst, dass Perl ein paar nette Module mit Excel-Dateien zu tun hat, so die Idee ist, sagen wir mal, laufen die täglich überprüfen, vielleicht mit cron, und schreiben das Ergebnis auf einer Tabelle für weitere statistische Verwendung.

War es hilfreich?

Lösung

Sie können die Größe der Datei, überprüfen Sie die -s-Operator.

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

Eine einfache Möglichkeit, Excel-Dateien zu schreiben, wäre mit Kalkulationstabelle :: Schreiben . aber wenn Sie eine vorhandene Excel-Datei aktualisieren müssen, sollten Sie prüfen Kalkulationstabelle :: ParseExcel .

Andere Tipps

Sie können mit dem -s Operator die Größe einer Datei und die Tabelle :: ParseExcel und Kalkulationstabelle :: ParseExcel :: SaveParser Sie bequem die beiden kombinieren lässt, im Fall, dass Sie eine vorhandene Datei mit neuen Informationen zu aktualisieren. Wenn Sie unter Windows sind, können Sie Excel selbst statt, wahrscheinlich mit Hilfe von Win32 automatisieren :: OLE .

Sie können auch die Mühe des Schreibens .xls-Dateien überspringen und ein allgemeineres (aber ausreichend Excel freundlich) Format wie CSV verwenden:

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

Dann in Ihrer crontab:

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

Dann importieren Sie die CSV-Datei in Excel wie jede andere Tabelle.

Perl hat auch die sehr schön (und sehr schnell ) Text :: CSV_XS , die Sie erlaubt, Excel-freundliche CSV-Dateien zu machen, die eine bessere Lösung als die Schaffung richtige XLS-Dateien sein kann.

Zum Beispiel (über kommentiert für Lehr-Wert):

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

Das Modul Sie verwenden sollten, ist Kalkulationstabelle :: WriteExcel .

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top