【发布时间】:2012-05-25 12:19:49
【问题描述】:
我刚刚开始使用 Perl 进行编码,我只是想看看下面的代码是否可以变得更高效或可以用更少的行数完成。
我已经对Win32::OLE 模块和Text::CSV 模块进行了一些研究,但这似乎与我目前所读的内容不同。
这个问题基本上是一个新手问一个长辈:“嘿,我如何成为一个更好的 Perl 程序员?”
代码的目的是从 Excel 工作簿的指定工作表中的指定范围获取数据,并将这些范围的内容写入 CSV 文件。
另外,我知道我需要执行一般检查,例如确保在将我的 $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;
}
}
}
【问题讨论】:
-
顺便说一句,您的代码对于非专家来说已经非常好!您可以采取一些措施来使其更惯用(请参阅答案),但这是一个很好的开始!
-
@DVK +1 表示鼓励。谢谢你。很高兴知道我有一个好的开始。
-
既然这不是一个真正的问题,恕我直言,它会更适合codereview.stackexchange.com
-
啊,我不知道 codereview.stackexchange。下次还会去
标签: perl