1

我遇到了模块DBD::CSV v0.30 的问题。由于更新到 newes 版本,fetchrow_hashref 生成的哈希中的所有标题都是小写而不是混合大小写。

最后,数据将被提交到 mysql 数据库,并且列标题应该是大小写混合。

这是我使用DBD::CSV的脚本片段

my $csv_dbh = DBI->connect("DBI:CSV:f_dir=\.;csv_eol=\n");
$csv_dbh->{f_dir} = $ElementConfig->{_DIR} if defined($ElementConfig->{_DIR});
$csv_dbh->{csv_sep_char} = "$Seperator" if (defined($Seperator));
$csv_dbh->{csv_eol} = $csv_eol if (defined($csv_eol));
$csv_dbh->{csv_allow_whitespace} = $csv_allow_whitespace if (defined($csv_allow_whitespace));
my $CSV_Select;
unless (defined($ref_FullSQLSt)) { 
    // Standard "SELECT * FROM filname.txt"
    $CSV_Select = "SELECT ".${$ref_CSVSelect}." FROM $File ".${$ref_CSVWhere};
} else {
    $CSV_Select = ${$ref_FullSQLSt};
}
my $sth = $csv_dbh->prepare($CSV_Select);
my $res = $sth->execute();
while (my $row = $sth->fetchrow_hashref()) {
    my $PKeys = $index;
    if (defined($ElementConfig->{_FILES}->{$File}->{_dkey})) {
        my $NewPKeys = "";
        for my $key (split (/\s*\,\s*/,$ElementConfig->{_FILES}->{$File}->{_dkey})) {
            if (defined($row->{$key})) {
                $NewPKeys .= $row->{$key};
            }
        }
        $PKeys = $NewPKeys if ($NewPKeys);
    }

    unless (defined($DataHash->{$DBConfig->{TBLPREFIX} . $ElementConfig->{_FILES}->{$File}->{_dtbl}}->{$PKeys})) {
        $DataHash->{$DBConfig->{TBLPREFIX} . $ElementConfig->{_FILES}->{$File}->{_dtbl}}->{$PKeys} = $row;
        $index ++;
    }
}

这是 csv 文件的片段:

CELL    DATE    avgRxLevUl  avgRxLevDl  RXQUALUL0 
RTAL3D  08.12.2009 15:50    -96.25072834    -92.32065149    179594

实际的 fetchrow_hashref 看起来像这样:

$var-> {
   'cell' => 'RTAL3D',
   'date' => '08.12.2009',
   'avgrxlevu1' => -96.25072834
   ...
}

我用 $sth->fetchrow_hashref() 方法尝试了几件事。我使用了参数“NAME”、“NAME_lc”和“NAME_uc”。第一个和第二个将标题转换为小写,第三个转换为大写。

谢谢你的帮助。

4

1 回答 1

4

如果您使用q(SELECT * FROM tbl)SQL::Statement将标识符转换为小写。由于处理中的一些内部问题,这是必要的。要获取混合大小写的列名称,请按您需要的名称查询它们:

q(SELECT CELL, DATE, avgRxLevUl, avgRxLevDl, RXQUALUL0 FROM tbl).
于 2010-07-28T10:10:12.330 回答