【问题标题】:Parsing CSV with Text::CSV用 Text::CSV 解析 CSV
【发布时间】:2014-08-18 19:12:06
【问题描述】:

我正在尝试解析标题行位于第 8 行的文件。第 9-n 行是我的数据。我怎样才能使用Text::CSV 来做到这一点?我遇到了问题,我的代码如下:

my @cols = @{$csv->getline($io, 8)};
my $row = {};
$csv->bind_columns (\@{$row}{@cols});


while($csv->getline($io, 8)){


    my $ip_addr = $row->{'IP'};

}

【问题讨论】:

  • 你能举一个CSV文件中几行的例子吗?
  • 前几行是垃圾数据。在第 8 行之前我什么都不需要,它包含标头(IP、DNS、MAC 等)。然后在它下面逐行显示每个主机的信息。
  • 在阅读标题行之前类似于readline $io for 1 .. 7 的内容?
  • 我是 text::csv 的新手。老实说,我不确定我需要做什么来提取标题行并将数据行绑定到它。
  • 对于初学者来说,getline_all(获取所有记录)应该是getline(获取记录)。

标签: perl parsing csv


【解决方案1】:
use Text::CSV;

my $csv = Text::CSV->new( ) or die "Cannot use CSV: ".Text::CSV->error_diag ();
open my $io, "test.csv" or die "test.csv: $!";
my $array_ref = $csv->getline_all($io,  8);
my $record = "";
foreach $record (@$array_ref) {
    print "$record->[0] \n";
}
close $io or die "test.csv: $!";

【讨论】:

    【解决方案2】:

    您是否对使用 bind_columns 很执着?我想我看到了你想要做的事情,这在理论上很有创意,但如果你想要的只是一种通过标题名称引用列的方法,那么这样的事情怎么样:

    use strict;
    use warnings;
    
    use Text::CSV;
    
    my $csv = Text::CSV->new ( { binary => 1 } );
    my (%header);
    
    open my $io, "<", '/var/tmp/foo.csv' or die $!;
    while (my $row = $csv->getline ($io)) {
      next unless $. > 7;
      my @fields = @$row; 
    
      unless (%header) {
        $header{$fields[$_]} = $_ for 0..$#fields;
        next;
      } 
    
      my $ip_addr = $fields[$header{'IP'}];
      print "$. => $ip_addr\n";
    }
    close $io;
    

    示例输入:

    Test Data,,,
    Trash,,,
    Test Data,,,
    Trash,,,
    Beans,Joe,10.224.38.189,XYZ
    Beans,Joe,10.224.38.190,XYZ
    Beans,Joe,10.224.38.191,XYZ
    Last Name,First Name,IP,Computer
    Beans,Joe,10.224.38.192,XYZ
    Beans,Joe,10.224.38.193,XYZ
    Beans,Joe,10.224.38.194,XYZ
    Beans,Joe,10.224.38.195,XYZ
    Beans,Joe,10.224.38.196,XYZ
    Beans,Joe,10.224.38.197,XYZ
    

    输出:

    9 => 10.224.38.192
    10 => 10.224.38.193
    11 => 10.224.38.194
    12 => 10.224.38.195
    13 => 10.224.38.196
    14 => 10.224.38.197
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-12-16
      • 1970-01-01
      • 2013-08-31
      • 1970-01-01
      • 2014-04-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多