gpt4 book ai didi

Perl - 代码增强

转载 作者:行者123 更新时间:2023-12-04 09:36:50 25 4
gpt4 key购买 nike

我刚刚开始使用 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;
}
}
}

最佳答案

马克的建议是一个很好的建议。另一个小的改进是将“做一堆嵌套逻辑if $cell”替换为“不做任何事情unless $cell”。 - 这样你的代码可读性更高(删除 1 个额外的缩进/嵌套 block ;并且不必担心如果 $cell 为空会发生什么。

# OLD
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
# All your logic in the if
}
}

# NEW
foreach my $sheet (@sheets) {
my $worksheet = $excel->Worksheet($sheet);
next unless $worksheet->get_cell(25,0); # You don't use $cell, so dropped

# All your logic that used to be in the if
}

如您所述, Text::CSV这将是一件好事,这取决于您的数据是否需要根据 CSV 标准引用(例如,包含空格、逗号、引号等)。如果可能需要引用,不要重新发明轮子,使用 Text::CSV用于打印。未经测试的示例将是这样的:
# At the start of the script:
use Text::CSV;
my $csv = Text::CSV->new ( { } ); # Add error handler!

# In the loop, when the file handle $fh is opened
foreach my $row (24 .. $maxRow) {
my $cols = [ map { $worksheet->{Cells}[$row][$_] } 0 .. $maxCol) ];
my $status = $csv->print ($fh, $cols);
# Error handling
}

关于Perl - 代码增强,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10744711/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com