加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

Perl – 代码增强

发布时间:2020-12-15 21:53:34 所属栏目:大数据 来源:网络整理
导读:我刚开始用Perl编写代码,我只是想知道下面的代码是否可以提高效率,或者可以用更少的代码完成. 我已经对 Win32::OLE 模块和 Text::CSV 模块进行了一些研究,但这似乎是从我到目前为止阅读的方式. 这个问题基本上是一个问老人的新手:“嘿,我怎样才能成为一个更
我刚开始用Perl编写代码,我只是想知道下面的代码是否可以提高效率,或者可以用更少的代码完成.

我已经对Win32::OLE模块和Text::CSV模块进行了一些研究,但这似乎是从我到目前为止阅读的方式.

这个问题基本上是一个问老人的新手:“嘿,我怎样才能成为一个更好的Perl程序员?”

代码的目的是从Excel工作簿的指定工作表中的指定范围获取数据,并将这些范围的内容写入CSV文件.

此外,我知道我需要实现一般检查,比如确保在将$cellValue添加到数组之前定义了我的$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 "$rowStringn";
            undef $rowString;
        }
    }
}

解决方法

马克的建议非常好.另一个小改进是替换“如果是$cell,请执行一堆嵌套逻辑”,除非$cell,否则不要执行任何操作 – 这样您可以使用稍微更易读的代码(删除1个额外的缩进/嵌套块;并且不要不得不担心如果$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
    }

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读