كيف يمكنني التحقق من حجم الملف و أضيف أن النتيجة في جدول بيانات Excel في بيرل?
سؤال
حاليا أنا الرصد ملف معين مع قذيفة بسيطة بطانة واحدة:
filesize=$(ls -lah somefile | awk '{print $5}')
أنا على علم بأن بيرل بعض وحدات لطيفة للتعامل مع ملفات Excel إذن الفكرة هي أن, دعنا نقول, تشغيل التي تحقق يوميا ، وربما مع كرون ، وكتابة النتيجة في جدول بيانات لمزيد من الاستخدام الإحصائي.
المحلول
يمكنك التحقق من حجم الملف باستخدام -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 يتيح لك بسهولة الجمع بين اثنين, في حال كنت ترغب في تحديث ملف موجود مع المعلومات الجديدة.إذا كنت على ويندوز ، قد ترغب في أتمتة 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 تماما مثل أي جداول البيانات الأخرى.
بيرل أيضا لطيفة جدا (جدا سريع) النص::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
الوحدة يجب أن تكون باستخدام هي جدول::WriteExcel.