如何通过perl中的hash来引用文本文件的每一列

时间:2014-12-10 12:56:23

标签: perl

我有一个文件存储由|(管道标志)分隔的查询结果。我希望每个列都被哈希引用。

例如。 f.txt文件包含是:

aaa|bbb|ccc  
ddd|eee|fff  
ggg|hhh|iii

我需要o / p为:

a{a}=> {aaa,ddd,ccc}  
a{b}=> {bbb,eee,hhh}  
a{c}=> {ccc,fff,iii}

请提供相同的建议。

1 个答案:

答案 0 :(得分:1)

我认为您最好将数据表示为数组数组而不是哈希哈希。这是因为您不知道是什么。数组是 有序列表 数据,您至少可以通过这种方式引用数据的特定行和列,而无需为其创建键。

如果您知道列的名称,则可能需要哈希数组。这样,您可以在数组中引用具有元素编号的特定行,但是通过名称引用该列。

这是使用数组数组

use strict;
use warnings;
use autodie;
use feature qw(say);

use constant {
    FILE_NAME => "...",
};

open my $fh, "<", FILE_NAME;

#
#  This builds your Array of Arrays
#

my @file_contents;
while ( my $row = <$fh> ) {
    chomp $row;
    push @file_contents, split /\s*\|\s*/, $row;
}

#
# We count from 1, but arrays count from zero. That's why array indexes
# are one less than the row and column I am referring to.
#
say "The first row and second column is " . $file_contents[0]->[1];
say "The third row and third column is " .  $file_contents[2]->[2];

#
# This reprints entire file with the separators
#

for my $row ( @file_contents ) {
    @columns = @{ $row };
    say join "|", @columns;
}

附录

  

我也知道我的列和哈希键是什么。我需要将此o / p传递给内置API,该API仅将参数作为哈希。因此无法将数据存储在数组中。

你是说你的列是一个哈希,列名是哈希键吗?这是有道理的。如果你说每个ROW都有自己的,你必须让我知道它是什么,它来自何处。

这是一个在名为@file_contents的数组中创建文件内容的解决方案。它包含一个表示每行数据的哈希的引用,其中键是列名,值是该列的数据。然后,您可以使用此哈希值通过API进行更新:

这是通过两个循环完成的:一个使用您的API填充@file_contents和另一个循环(不过已完成)。没有理由不能在一个循环中完成它。

use strict;
use warnings;
use autodie;
use feature qw(say);

use constant {
    FILE_NAME => "...",
};

# Names of the columns
my @column_names = qw( foo bar barfu fubar foofoo barbar );

open my $fh, "<", FILE_NAME;

#
#  This builds your Array of Column hashes
#

my @file_contents;
while ( my $row = <$fh> ) {
    chomp $row;
    @cols =  split /\s*\|\s*/, $row;
    my %col_hash;
    for $col_num ( 0.. $#file_contents ) {
       %col_hash{ $col_name[ $col_num ] } = $cols[ $column_num ];
    }
    push @file_contents, \%col_hash;
}

for my $cols_ref ( @file_contents ) {
    my %col_hash = %{ $cols_ref };
    API_CALL (..., ..., %col_hash );
}

如果这确实是哈希的哈希值,那就是表的是哈希条目,你必须让我知道密钥的来源。表的第一列很可能是其余数据的关键。例如,让我们说你的表看起来像这样:

 Visitors in thousands

city  |jan |apr |july|oct|
Duluth|0   |0   |0   |0
NYC   |500 |1200|1500|600
Miami |1200|1600|2300|200

我可以想象 city 是每行的关键,而月份是每列的关键。我可以谈谈这个:

say "The number of people in NYC in July is " . $visitors{NYC}->{july};

您的数据是这种情况吗?如果没有,哈希是什么?当然,我不应该为散列键组成随机值。

您必须更清楚地说明您的需求。