无法从CSV文件中选择列

问题描述

我使用Perl通过DBI连接到DBD :: CSV,连接良好,并且在启动时有效

SELECT * FROM dp_id.csv 

它工作正常,但是当我想提取单个列时。

my $dbh = DBI->connect ("dbi:CSV:",undef,{ f_dir => "." });

my $query = " SELECT dpname from dp_id.csv";


my $sth   = $dbh->prepare ($query);
$sth->execute ();

while (my @row = $sth->fetchrow_array)
{
    print @row,"\n";
}

我遇到这个错误

 Execution ERROR: No such column 'dpname' called from extract.pl at 20.
 [for Statement " SELECT dpname from dp_id.csv"] at extract.pl line 20.
 DBD::CSV::st fetchrow_array Failed: Attempt to fetch row without a preceding execute () call or from 
 a non-SELECT statement [for Statement " SELECT dpname from dp_id.csv"] at extract.pl line 22.

以下是csv文件的摘录:

kindOfInfo;dpname;TypeName;ID
interface;ALLARM;DPT_TS;344108
interface;POMP1;DPT_TS;7923082

解决方法

默认情况下,DBD :: CSV假定您的文件是逗号分隔的(因为CSV中的“ CS”代表:-))

您的数据用分号分隔。因此,在创建连接时,您需要告诉DBD :: CSV。

my $dbh = DBI->connect ("dbi:CSV:",undef,{
  f_dir        => ".",csv_sep_char => ';',# This is the important line
});

否则,DBD会将您的数据视为名称为“ kindOfInfo; DpName; TypeName; ID”的单列。