【问题标题】:Perl Loop Output to Excel SpreadsheetPerl 循环输出到 Excel 电子表格
【发布时间】:2011-10-17 13:52:03
【问题描述】:

我有一个 Perl 脚本,其相关部分张贴在下面。

# Pull values from cells
        ROW:
        for my $row ( $row_min + 1 .. $row_max ) {
            my $target_cell   = $worksheet->get_cell( $row, $target_col);
            my $response_cell = $worksheet->get_cell( $row, $response_col);

            if ( defined $target_cell && defined $response_cell ) {
                my $target   = $target_cell->value();
                my $response = $response_cell->value();

# Determine relatedness
                my $value      = $lesk->getRelatedness($target, $response);

# Copy output to new Excel spreadhseet, 'data.xls'
                my $workbook1  = Spreadsheet::WriteExcel->new('data.xls'); 
                my $worksheet1 = $workbook1->add_worksheet();
                $worksheet1->set_column(0, 3, 18);
                my $row = 0;

                foreach ($target) {
                $row++;
                $worksheet1->write( $row, 0, "Target      = $target\n");
                $worksheet1->write( $row, 1, "Response    = $response\n");
                $worksheet1->write( $row, 2, "Relatedness = $value\n");
                }
            }
        }

此脚本使用 Perl 模块 ParseExcel 和 WriteExcel。输入数据电子表格是两列下的单词列表,一列标记为“目标”,另一列标记为“响应”。该脚本获取每个目标词和每个响应词,并计算它们之间的相关性值(这就是

$lesk->getRelatedness

部分代码正在做。它正在调用一个名为 WordNet::Similarity 的 perl 模块,用于计算单词之间的相关性度量)。

所有这些都可以正常工作。问题是我正在尝试将输出(相似性度量,或此脚本中的 $value)写入新的 Excel 文件。无论我对代码做什么,它给我的唯一输出是 LAST 目标和响应词之间的相关性。它忽略了所有其余部分。

但是,这只发生在我尝试写入 Excel 文件时。如果我改用“打印”功能,我可以在命令窗口中看到所有输出。我总是可以将其复制并粘贴到 Excel 中,但如果我可以自动执行此操作会容易得多。知道问题是什么吗?

【问题讨论】:

  • foreach ($target) 是一个无用的循环。 $target 是一个单值变量,循环只会执行一次,而 $row 始终为 1(因为它被重置为 0)。此外,如果您使用了 strict 和 warnings,您应该会收到关于第二个 $row 变量的警告,该变量覆盖了之前定义的变量。
  • 我确实使用了严格和警告。它没有给我任何错误信息。您对如何替换 foreach 循环有什么建议吗?是否可以将每个 $target 和 $response 值保存为数组中的元素?
  • 此代码会出错,因为您在同一范围内的两个地方声明了my $row。如果没有,那么有些东西是可疑的。正如我所说的 foreach 循环是无用的,因为标量值只能有 1 个值。在不知道你想要完成什么的情况下,很难说如何解决它。但是,由于您正在(过度)写入相同的 $row,因此您只能看到打印的最后一个值。
  • 我已经通过严格和警告多次运行它,没有错误。我已经描述了我想要完成的事情,我不知道如何进一步解释它。如果标量值一次只能有 1 个值,有没有办法将其转换为数组?而且我不再覆盖同一个 $row,因为 $row 不再设置为 0(见下文)。
  • 您应该更新您的问题以反映对您的脚本所做的更改。

标签: perl excel loops foreach


【解决方案1】:

问题解决了。我只需要移动

my $workbook1 = Spreadsheet::WriteExcel->new('data.xls'); 
my $worksheet1 = $workbook1->add_worksheet();

行到脚本的另一部分。由于它们在“for”语句中,因此程序每次运行循环时都会覆盖“data.xls”文件。

【讨论】:

    【解决方案2】:

    您每次都将 $row 的值重置为 0。

    【讨论】:

    • 我把它拿出来重新运行了脚本。结果相同。使用“我的 $row = 0”代码,唯一的输出在第 2 行。当我把它拿出来时,它仍然只给我最后一个数据的输出,但现在它被撞到了第 31 行。应该在哪个位置,但为什么没有为其余行填充数据?
    • Billy,尝试添加一个打印语句,看看是否正在使用您的条件 if 语句。可能没有打印它们,因为可能没有定义这两个值。此外,如果您要生成多个文件,您可能应该将 workbook1->close() 添加到 for 循环的末尾
    • 谢谢,你说得对,我应该在里面有结束声明。如果我使用“打印”,则会出现所有适当的值。
    猜你喜欢
    • 1970-01-01
    • 2017-11-15
    • 1970-01-01
    • 2015-10-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-20
    • 1970-01-01
    相关资源
    最近更新 更多