使用Tie :: Handle :: CSV打印CSV标题

时间:2010-01-13 18:07:58

标签: perl

我使用Tie :: Handle :: CSV编写了一个perl脚本来处理csv文件中的一堆数据,并将我需要的内容打印到新的csv文件中。现在,我打印出带有所有字段名称的标题行,只需硬编码就可以了:

print '"TERM", "STUDENT ID", "NAME", ..."'."\n";

我怀疑这是一种愚蠢的方式,但我不知道如何从Tie :: Handle :: CSV对象中访问标题。它被实例化,如此,

my $fh = Tie::Handle::CSV->new($file,header=> 1);

和数据的访问方式如下,

$line -> {'CATALOG_NBR'}

我知道这是一个哈希引用,但还不足以知道如何使用它来打印头而不是硬编码。显然,“他们”通常会在我每个学期再次使用脚本之后更改精确的列名和排序。

非常感谢您的帮助! JA

4 个答案:

答案 0 :(得分:6)

派对有点晚了,但我刚刚发布了Tie::Handle::CSV的新版本(应该会在几个小时内推出CPAN)。它增加了对header()方法的支持,该方法返回CSV格式的标题。用法可能如下所示:

   my $fh = Tie::Handle::CSV->new( $file, header => 1 );
   print $fh->header;

希望这有帮助,

  • danboo

答案 1 :(得分:3)

如果定义了标头而不是数组引用,则文档的第一行将用作标题。遗憾的是,没有方法可以像原来那样获得这样的标题,所以没有使用header选项读取第一行为false,存储它(它已经是数组引用)并关闭文件并重新读取,我不知道看到一种更简单的方法。

use strict;
use warnings;
use Tie::Handle::CSV;
use Data::Dumper;

my $csv_fh = Tie::Handle::CSV->new('basic.csv', header => 0);
my $header = <$csv_fh>;
close $csv_fh;
print join(',', @$header), "\n";

$csv_fh = Tie::Handle::CSV->new('basic.csv', header => 1);
while (my $csv_line = <$csv_fh>) {
    # $csv_line can be used here
    ...
}
close $csv_fh;

答案 2 :(得分:2)

根据the documentation,看起来关闭构造函数中的header => 1将导致它不解析标头。然后,您应该将标题列名称作为从对象返回的第一个$line

这也意味着您的$line将是数组引用而不是哈希引用,因此您需要使用$line->[0]$line->[1]等打印出位置值,而不是使用标题名称。

如果要使用header => 1选项,可以使用my @headers = keys %{ $line }获取哈希键。请注意,不能保证密钥按任何特定顺序排列,因此您必须找到一种方法来自行订购。

我实际上并没有使用过这个模块,所以这是基于阅读header选项文档的猜想。

答案 3 :(得分:1)

谢谢你们 - 我最终基本上结合了你的建议。我打开了两个文件句柄 - 第二个$ hfh with header =&gt; 0所以我可以按照正确的顺序打印标题标签,如下所示:

my $fh = Tie::Handle::CSV->new($file,  header => 1);
my $hfh = Tie::Handle::CSV->new($file, header=>0);
my $line = <$hfh>;
my $header;
foreach(@{$line}) {
  $header .= "\"$_\",";
}
print "$header\n";

再次感谢您的协助!