首页 > 解决方案 > Perl - 使用 Text::CSV 将字符串/标量值写入 CSV

问题描述

我正在尝试将连接成功/失败写入从多个数据库中提取的 CSV 文件,以便我可以验证我的 eval 是否有效,并且连接失败不会使脚本停止。有一个 CSV 文件,其中包含要使用的数据库主机名和架构,我会循环使用它。我可以毫无问题地读取文件,但是在将特定值作为一种“格式化”以显示数据和测试 DBI 连接时,我在将特定值写入文件时遇到了一些麻烦。

最初,我尝试只使用多个打印语句,但没有奏效。我尝试将字符串和标量转换为 Perl 报告的数组 ref。当我创建数组并放入数组引用时,我没有任何错误,但我只得到了引用。但我需要打印出来的文字。

我正在使用的代码在下面,并且有几行我之前尝试过的注释行,但没有奏效。如果与数据库的连接失败以及它在哪个位置,则 eval 用于写入。

我知道我做错了什么,否则它会起作用。但是,我不知道我要去哪里错了。

# Instantiate Report Data CSV
my $reportCsv = Text::CSV->new();
$reportCsv->eol ("\n");
$reportCsv->sep_char (",");
$reportCsv->quote_char ("\"");
$reportCsv->always_quote (1);
$reportCsv->escape_char ("\\");
$reportCsv->strict (1);

# Open stores.csv for processing
open my $storesFile, "<:encoding(utf8)", "stores.csv" or $logger->logdie("Failed to open stores.csv.");
open my $reportOutput, ">:encoding(utf8)", "report.csv" or $logger->logdie("Failed to generate CSV.");

# Read the file and dump to another CSV
while (<$storesFile>) {
    if ($storeCsv->parse($_)) {
        my @storeInfo = $storeCsv->fields();
        my @successArray = [$storeInfo[0], "\n", "---------------\n", "Connected to $storeInfo[2] at $storeInfo[1].\n\n"];
        my @failureArray = [$storeInfo[0], "\n", "---------------\n", "Failed to connect to store database.\n\n"];
        #print "$storeInfo[0], $storeInfo[1], $storeInfo[2]\n";
        eval {
            my $storeConnection = DBI->connect("DBI:mysql:database=$storeInfo[2];host=$storeInfo[1];port=3306", "username", "password", { RaiseError => 1, PrintError => 1 }) or $logger->error("Failed to connect to database.");
        };
        if ($@) {
            $reportCsv->print($reportOutput, \@failureArray);
            #$reportCsv->print($reportOutput, "\n");
            #$reportCsv->print($reportOutput, "---------------\n");
            #$reportCsv->print($reportOutput, "Failed to connect to store database.\n\n");
        }
        $reportCsv->print($reportOutput, \@successArray);
        #$reportCsv->print($reportOutput, "\n");
        #$reportCsv->print($reportOutput, "---------------\n");
        #$reportCsv->print($reportOutput, "Connected to $storeInfo[2] at $storeInfo[1].\n\n");
    } else {
        my $inputError = $storeCsv->error_input;
        print "Failed to parse line: $inputError" or $logger->error($inputError);
    }
}

标签: csvperlexport-to-csv

解决方案


推荐阅读