Perl でコーディングを始めたばかりで、以下のコードをより効率的にできるか、またはより少ない行数で実行できるかを調べています。
Win32::OLE
モジュールとモジュールについて少し調べましたText::CSV
が、これまで読んだことから、これが進むべき道のように思えました。
この質問は基本的に、初心者が年長者に尋ねるものです。
コードの目的は、Excel ブックの指定されたシートの指定された範囲からデータを取得し、それらの範囲の内容を CSV ファイルに書き込むことです。
また、配列に追加する前に my が定義されていることを確認するなど、一般的なチェックを実装する必要があることはわかって$cellValue
いますが、全体的な構造をもっと探しています。行全体を一度に配列に入れたり、範囲全体を配列や参照に入れたり、その性質のものを入れたりして、ループを平坦化する方法はありますか?
ありがとう
use strict;
use warnings;
use Spreadsheet::XLSX;
my $excel = Spreadsheet::XLSX -> new ('C:\scott.xlsm',);
my @sheets = qw(Fund_Data GL_Data);
foreach my $sheet (@sheets) {
my $worksheet = $excel->Worksheet($sheet);
my $cell = $worksheet->get_cell(25,0);
if ($cell) { # make sure cell value isn't blank
my $myFile = "C:/$sheet.csv";
open NEWFILE, ">$myFile" or die $!;
# write all cells from Range("A25:[MaxColumn][MaxRow]") to a csv file
my $maxCol = $worksheet->{MaxCol};
my $maxRow = $worksheet->{MaxRow};
my @arrRows;
my $rowString;
# loop through each row and column in defined range and string together each row and write to file
foreach my $row (24 .. $maxRow) {
foreach my $col (0 .. $maxCol) {
my $cellValue = $worksheet->{Cells} [$row] [$col]->Value();
if ($rowString) {
$rowString = $rowString . "," . $cellValue;
} else {
$rowString = $cellValue;
}
}
print NEWFILE "$rowString\n";
undef $rowString;
}
}
}