【问题标题】:How to read a part of a csv file in perl如何在 perl 中读取 csv 文件的一部分
【发布时间】:2015-07-09 17:29:52
【问题描述】:

我有一个 CSV 文件,其模式如下:

start_var1 val1 val2
            abc   12
            xyz   23 
  end_var1  pqr   32

start_var2  val1 val2
            abc1  121
            xyz1  232
  end_var2  pqr1  341

我需要按以下模式将值保存在名为 var1_arrvar2_arr 的不同数组中:

val1(val2)

如果两行之间有任何空行,则不应保存空行,并且每个数组的值应分别介于 start_varend_var 之间。

if ( $columns[0] eq "start_var1" .. $columns[0] eq "end_var1") {
      if ( $columns[1] ne "") {
      push @var1_arr , "$columns[1]($columns[3])\n";
    }
}

【问题讨论】:

  • 这段代码对我有用,但问题是我不希望它在数组中推送 start_var* 行值,我怎样才能跳过阅读那一行。请帮忙!

标签: perl


【解决方案1】:

根据您的评论,要跳过一行,您可以这样写:

while (my $line = <$fh>)
{
    next if ($line =~ /start_var*/);    
    #do here whatever you want to do

}

【讨论】:

    【解决方案2】:

    你可以使用Text::CSV_XS。 (假设你有一个看起来像一个的 csv 文件,你粘贴的东西看起来像 2 个放在一起)

    use strict;
    use Text::CSV_XS;
    
    my $csv = Text::CSV_XS->new({binary => 1, auto_diag => 1, sep_char => ' '});
    
    open(my $fh, "<", $filename) or die "$! $filename";
    
    my $skip_heading = 1;
    my $col1; # rename as appropriate of course
    my $col2;
    my $col3;
    my @var1_arr;
    my @var2_arr;
    $csv->bind_columns(\$col1, \$col2, \$col3);
    while ($csv->getline($fh)) {
        if ($skip_heading == 1) {
            $skip_heading = 0;
            next;
        }
    
        if ($col2 and $col3) {
            push(@var1_arr, "$col2($col3)\n");
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2010-11-09
      • 2012-01-24
      • 2015-06-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多