Perl - 在CSV文件中连接SQL结果

时间:2013-01-07 17:52:57

标签: sql perl concatenation string-concatenation export-to-csv

我正在查询两列的数据库并将它们写入.csv文件。我遇到的问题是下面的代码行导致此错误:“在第105行的字符串中使用未初始化的值”。

print $file "$hash_ref->{'UserNM'}" . join("\t", "$hash_ref->{'EventDT'}" . "\n");

我要找的是文件中的内容:

User ID    Last Login TimeStamp
user12     2012-12-27 12:21:12
user49     2011-06-13 12:21:12
user43     2010-09-15 12:21:12
user09     2013-01-07 12:21:12
user87     2012-08-12 12:21:12
user38     2013-01-07 12:21:12
user31     2009-04-30 12:21:12

询问是否需要更多代码。

4 个答案:

答案 0 :(得分:2)

未定义其中一个哈希值。试试这个:

printf $file "%s\t%s\n", $hash_ref->{'UserNM'} // q{}, $hash_ref->{'EventDT'} // q{};

如果值未定义,则默认为空字符串(q{})。

答案 1 :(得分:0)

正如@gpojd所指出的,其中一个散列引用没有定义。您还可以为查询中的每个字段添加IFNULL/ISNULL语句,该字段可能会返回NULL,只是将它们设置为空白。

答案 2 :(得分:0)

听起来这仍然不适合你。为了您的调试目的,检查$ hash_ref-> {'UserNM'}和$ hash_ref-> {'EventDT'}是否在尝试打印之前定义可能是有益的。这将允许您为每个变量提供一个回退默认值,并至少让您分析一些输出。

my $UserNM;
my $EventDT;

if (defined($hash_ref->{'UserNM'})) {
    $UserNM = $hash_ref->{'UserNM'};
} else {
    $UserNM = "default username";
}

if (defined($hash_ref->{'EventDT'})) {
    $EventDT= $hash_ref->{'EventDT'};
} else {
    $EventDT= "default event date";
}

print $file "$UserNM" . join("\t", "$EventDT" . "\n");

答案 3 :(得分:0)

我决定使用以下代码简化连接并将列作为变量传递:


    my $usernm = "$row->{'UserNM'}";
    my $logindt = "$row->{'EventDT'}";

    # dump users and last login timestamp into file
        print MYFILE "$usernm \t $logindt \n";

在我看来,这更简单,更清洁。它有效。有人不同意吗?