【问题标题】:How to use DBD::CSV to get column names row?如何使用 DBD::CSV 获取列名行?
【发布时间】:2012-10-23 01:30:50
【问题描述】:

我正在使用DBD::CSV 来显示 csv 数据。我的代码是:

#! perl
use strict;
use warnings;
use DBI;

my $dbh = DBI->connect("dbi:CSV:", undef, undef, {
    f_dir            => ".",
    f_ext            => ".txt/r",
    f_lock           => 2,
    csv_eol          => "\n",
    csv_sep_char     => "|",
    csv_quote_char   => '"',
    csv_escape_char  => '"',
    csv_class        => "Text::CSV_XS",
    csv_null         => 1,
    csv_tables       => {
        info => {
            file => "countries.txt"
        }
    },  
    FetchHashKeyName => "NAME_lc",
}) or die $DBI::errstr;

$dbh->{csv_tables}->{countries} = {
  skip_first_row => 0,
  col_names => ["a","b","c","d"],
  raw_header => 1,
};

my $sth = $dbh->prepare ("select * from countries limit 1");
$sth->execute;
while (my @row = $sth->fetchrow_array) {
  print join " ", @row;
  print "\n"
}

country.txt 文件是这样的:

ISO_COUNTRY|COUNTRY_NAME|REGION_CODE|REGION_NAME
AF|Afghanistan|A|Asia
AX|"Aland Islands"|E|Europe
AL|Albania|E|Europe

但是当我运行这个脚本时,它会返回

AF Afghanistan A Asia

我希望它返回:

ISO_COUNTRY COUNTRY_NAME REGION_CODE REGION_NAME

有谁知道如何使用 DBD::CSV 模块来实现这一点?

还有一个问题是col_names属性设置为什么没有生效? 如何使其返回以下内容?

 a b c d

【问题讨论】:

    标签: perl csv dbd


    【解决方案1】:

    $sth->{NAME}$sth->{NAME_lc}$sth->{NAME_uc} 返回对包含名称的数组的引用。

    my $sth = $dbh->prepare("select * from countries limit 1");
    $sth->execute;
    print "$_\n" for @{ $sth->{NAME} };
    

    【讨论】:

    • 谢谢。实际上你的代码会返回我想要的。我还有一个问题,我手动将列名指定为a、b、c、d。为什么它不起作用?我更新了我的问题。
    • search.cpan.org/~hmbrand/DBD-CSV-0.36/lib/DBD/… 这是文档。但我不知道为什么它不能按预期工作。默认情况下,DBD::CSV 假定列名存储在 CSV 文件的第一行并对其进行清理(参见下面的 raw_header)。如果不是这种情况,您可以使用 col_names 属性提供表名的数组 ref。在这种情况下,属性 skip_first_row 将设置为 FALSE。如果您提供一个空数组 ref,驱动程序将为您读取第一行,计算列数并创建列名,如 col0、col1、...
    • 请将您的新问题作为新问题提出。 (请注意同时使用raw_headers => 1col_names 没有任何意义。另请注意,即使您说不,也会跳过该行,因此可能由于某种原因没有使用这些选项。 )
    • 好的解决了这个问题,我又提出了一个问题:stackoverflow.com/questions/13016794/…
    猜你喜欢
    • 2011-08-12
    • 1970-01-01
    • 2011-02-17
    • 2011-02-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多