【问题标题】:perl use hash to read a fileperl 使用哈希读取文件
【发布时间】:2014-07-13 16:05:48
【问题描述】:

我正在尝试在 Perl 中编写一个函数,该函数将哈希和文件名作为输入。

基本上我的哈希是这样的,例如datahash是哈希的名称

datahash(Attr1) = 1
datahash(Attr2) = 5
datahash(Attr3) = 4
datahash(Attr4) = 6

我的文件是带有 Attr1,Attr2.. 的 csv,因为 csv 中的列名和哈希值是同一文件中的列号。

我的函数需要根据哈希键和值从文件中提取数据。任何线索或想法?它需要将文件的列名与哈希匹配,找出列号,然后提取列号的值。需要提取几列。

下面是我的代码:(不用担心我可以循环打印多次)

my %dataHash = %{$_[0]};
my $fileName = $_[1];   
my @keys = keys %dataHash;
my @values = values %dataHash;
open my $info, $file;
while( my $line = <$info>)  
{
            my @arrdata = split(/,/, $line);
            print @arrdata[values[0]];
            print @arrdata[values[1]];
            print @arrdata[values[2]];
            print @arrdata[values[3]];
            print @arrdata[values[4]];
            print @arrdata[values[5]];          
    }

示例文件:

attr1,abc,def,ghi,attr3,attr2,attr4,attr5,attr6
1,2,3,4,5,6,7,8,9
11,12,13,14,15,16,17,18,19
11,12,13,14,15,16,17,18,19
11,12,13,14,15,16,17,18,19

所以哈希有我需要提取的列名和列号,文件是这样的。

【问题讨论】:

  • @keys 的用途是什么?好像你没有在循环中使用它..
  • 现在刚刚提取。大多数操作只需要通过值来完成
  • 仍然不清楚你想要达到什么目标。请提供示例输入文件和该函数的预期输出。

标签: windows perl csv hash


【解决方案1】:

使用Text::CSV

use strict;
use warnings;

use Text::CSV;

my @rows;
my $csv = Text::CSV->new ( { binary => 1 } )
    or die "Cannot use CSV: ".Text::CSV->error_diag ();

my $fh = \*DATA; # Open a fh instead

my $header = $csv->getline( $fh );

while ( my $row = $csv->getline( $fh ) ) {
    my %hash;
    @hash{@$header} = @$row;
    push @rows, \%hash;
}
$csv->eof or $csv->error_diag();
close $fh;

use Data::Dump;
dd \@rows;

__DATA__
attr1,abc,def,ghi,attr3,attr2,attr4,attr5,attr6
1,2,3,4,5,6,7,8,9
11,12,13,14,15,16,17,18,19
11,12,13,14,15,16,17,18,19
11,12,13,14,15,16,17,18,19

输出:

[
  {
    abc   => 2,
    attr1 => 1,
    attr2 => 6,
    attr3 => 5,
    attr4 => 7,
    attr5 => 8,
    attr6 => 9,
    def   => 3,
    ghi   => 4,
  },
  {
    abc   => 12,
    attr1 => 11,
    attr2 => 16,
    attr3 => 15,
    attr4 => 17,
    attr5 => 18,
    attr6 => 19,
    def   => 13,
    ghi   => 14,
  },
  {
    abc   => 12,
    attr1 => 11,
    attr2 => 16,
    attr3 => 15,
    attr4 => 17,
    attr5 => 18,
    attr6 => 19,
    def   => 13,
    ghi   => 14,
  },
  {
    abc   => 12,
    attr1 => 11,
    attr2 => 16,
    attr3 => 15,
    attr4 => 17,
    attr5 => 18,
    attr6 => 19,
    def   => 13,
    ghi   => 14,
  },
]

【讨论】:

    【解决方案2】:

    为了让您开始,您可以尝试以下方法:

    #! /usr/bin/perl
    
    use warnings;
    use strict;
    
    my %dataHash;
    $dataHash{Attr1} = 1;
    $dataHash{Attr2} = 5;
    $dataHash{Attr3} = 4;
    $dataHash{Attr4} = 6;
    
    my $fileName = 'file.csv';
    
    my @keys = keys %dataHash;
    my @values = map {$_-1} values %dataHash;
    
    open (my $info, "<", $fileName);
    
    while( my $line = <$info>)  
    {
       chomp $line;
       my @arrdata = split(/,/, $line);
       print "@arrdata[@values]\n";
    }
    
    close($info);
    

    【讨论】:

    • 您永远不应该手动解析 CSV 文件。使用 CPAN 模块(例如 Text::CSV)
    • @DVK 同意,但我并不想给出一个完整的解决方案。
    猜你喜欢
    • 1970-01-01
    • 2020-01-29
    • 2011-11-29
    • 2012-12-11
    • 2015-04-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多