在Perl中哈希到CSV / TSV转换

时间:2015-12-29 06:12:47

标签: perl csv hash export-to-csv

我试图在Perl中将简单哈希转换为CSV / TSV。现在,棘手的部分是由于一些有趣的原因我无法使用Text::CSV::Slurp,而且我还在使用Text::CSV_XSText::CVS

问题描述:

我能够从我拥有的哈希创建一个CSV文件,但是值的显示并不是我希望它们如何。

示例:

这就是我的哈希的样子:

`$VAR1 = {
          '2015-12-09 10:49:00' => '750 mW',
          '2015-12-09 10:49:02' => '751 mW'
        };`

我希望键位于一个选项卡下,值可以位于另一个选项卡下。相反,我得到一个CVS,其中所有内容都处于逗号分隔状态。

期望的输出:

key1   value1
key2   value2 

实际输出:

key1  value1   key2   value2 

这就是我现在的代码:

open(DATA, "+>file.csv") || die "Couldn't open file file.csv, $!";
my $csv = Text::CSV_XS->new();
if ($input == 19){ 
    my $status = $csv->print (\*DATA, \@{[%hash1]});
}
elsif ($input == 11){
    my $status = $csv->print (\*DATA, \@{[%hash2]});
}
close(DATA) || die "Couldn't close file properly";

我在Stack Overflow和Perl Monks中经历过无数问题,但我不知道如何在不使用Text::CSV::Slurp的情况下找到解决方案。

请帮忙。

P.S:%hash1%hash2是简单的哈希值,它们具有基本的键值配对,并且不是哈希哈希值。但是,随着代码的发展,我可能还必须在HoH上实现逻辑。

1 个答案:

答案 0 :(得分:3)

如果我正确地读你,那就是你所追求的:

#!/usr/bin/env perl
use strict;
use warnings;

use Text::CSV;

my $VAR1 = {
          '2015-12-09 10:49:00' => '750 mW',
          '2015-12-09 10:49:02' => '751 mW'
        };

my $csv = Text::CSV -> new ( { sep_char => "\t", eol => "\n", binary => 1 } );
foreach my $key ( sort keys %{$VAR1} )  {
    $csv -> print ( \*STDOUT, [ $key, $VAR1 -> {$key} ] );
}

(或者,如果您使用哈希,而不是哈希引用):

foreach my $key ( sort keys %hash ) { 
     $csv -> print ( \*STDOUT, [ $key, $hash{$key} ] );
}

注意 - 这是显式排序,因为哈希是无序的。您希望使用可排序的日期格式,因此这应该没问题,但您可能需要将数据解析为时代并基于此进行解析。

输出

"2015-12-09 10:49:00"   "750 mW"
"2015-12-09 10:49:02"   "751 mW"

注意 - TSV嵌入引号,因为字段包含空格。您可以通过以下方式删除它们:

my $csv = Text::CSV -> new ( { sep_char => "\t", 
                               eol => "\n", 
                               binary => 1, 
                               quote_char => undef } );

我强烈建议不要使用DATA作为输出文件句柄,因为它已在perl中使用。事实上,我建议使用带有3个arg open的词法文件句柄:

open ( my $output, '>', 'file.csv' ) or die $!;

# ...

$csv -> print ( $output, ### everything else