【问题标题】:Can't select a column from csv file无法从 csv 文件中选择列
【发布时间】:2021-01-21 04:53:08
【问题描述】:

我使用 Perl 连接到带有 DBI 的 DBD::CSV,连接运行良好,当我启动时

SELECT * FROM dp_id.csv 

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

my $dbh = DBI->connect ("dbi:CSV:", undef, 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

【问题讨论】:

  • @vkk05 在第 20 行有查询的执行 $sth->execute()
  • execute() 之间有一个空格。这是导致问题的原因吗?
  • 提供一个示例 dp_id.csv 文件(只需几行)。
  • CSV 文件的第一行包含什么?
  • @vkk05:可以看到execute()被调用成功。所以,不,那个空间不是问题。

标签: sql csv perl odbc dbi


【解决方案1】:

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

您的数据以分号分隔。所以你需要在创建连接时告诉 DBD::CSV。

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-01-26
    • 1970-01-01
    • 1970-01-01
    • 2021-09-23
    • 1970-01-01
    • 1970-01-01
    • 2022-07-06
    相关资源
    最近更新 更多