¿Cómo puedo comprobar que el tamaño del archivo y añadir que el resultado en una hoja de cálculo de Excel en Perl?

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

  •  09-06-2019
  •  | 
  •  

Pregunta

Actualmente me supervisión de un archivo en particular con un simple shell one-liner:

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

Soy consciente de que Perl tiene algunas módulos a tratar con archivos de Excel así que la idea es, digamos, ejecute verificación, a diario, tal vez con cron, y escribir el resultado en una hoja de cálculo para su uso estadístico.

¿Fue útil?

Solución

Usted puede comprobar el tamaño del archivo mediante la opción-s del operador.

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

Una forma sencilla de escribir archivos de Excel sería el uso de Hoja De Cálculo::Escribir.pero si usted necesita para actualizar un archivo de Excel que usted debe buscar en Hoja De Cálculo::ParseExcel.

Otros consejos

Puede utilizar el -s operador para obtener el tamaño de un archivo y la Hoja De Cálculo::ParseExcel y Hoja De Cálculo::WriteExcel módulos de producir una versión actualizada de la hoja de cálculo con la información. Hoja De Cálculo::ParseExcel::SaveParser le permite combinar fácilmente los dos, en caso de querer actualizar un archivo existente con la nueva información.Si estás en Windows, puede que desee automatizar Excel mismo lugar, probablemente con la ayuda de Win32::OLE.

También se puede omitir la molestia de escribir .formato xls archivos y el uso de un más genérico (pero lo suficientemente Excel-friendly) formatos como CSV:

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

A continuación, en el crontab:

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

A continuación importar que .archivo csv en Excel como cualquier otra hoja de cálculo.

Perl también tiene muy bonito (y muy rápido) Texto: CSV_XS que le permite fácilmente hacer que Excel-friendly archivos CSV, que puede ser una solución mejor que la creación adecuada de los archivos XLS.

Por ejemplo (sobre-comentó por valor de instrucción):

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

El módulo que se debe utilizar es Hoja De Cálculo::WriteExcel.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top