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

Jas*_*son 6 perl

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

print '"TERM", "STUDENT ID", "NAME", ..."'."\n";
Run Code Online (Sandbox Code Playgroud)

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

my $fh = Tie::Handle::CSV->new($file,header=> 1);
Run Code Online (Sandbox Code Playgroud)

并且像这样访问数据,

$line -> {'CATALOG_NBR'}
Run Code Online (Sandbox Code Playgroud)

我知道这是一个哈希引用,但还不足以知道如何使用它来打印头而不是硬编码.显然,"他们"通常会在每个术语重新运行脚本之后更改精确的列名称和排序.

非常感谢您的帮助!JA

dan*_*boo 6

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

   my $fh = Tie::Handle::CSV->new( $file, header => 1 );
   print $fh->header;
Run Code Online (Sandbox Code Playgroud)

希望这可以帮助,

  • danboo


Leo*_*era 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;
Run Code Online (Sandbox Code Playgroud)