【问题标题】:Perl: Split file based on blank lines for processingPerl:根据空行拆分文件进行处理
【发布时间】:2014-02-04 13:49:28
【问题描述】:

我有一个具有常规模式的数据文件,我需要从中提取信息。 每个部分由一个空行分隔。 因此,我想知道是否可以根据空行拆分文件进行处理。

为了更好地解释我的问题,让我分享示例结构:

 Block: A1
 -----------------------------------
 Height:                       24.00
 Width:                         0.79
 Depth:                         0.04
 -----------------------------------

 Block: A2
 -----------------------------------
 Height:                       20.00
 Width:                         1.00
 Depth:                         0.54
 -----------------------------------

 Block: B1
 -----------------------------------
 Height:                        4.00
 Width:                         4.50
 Depth:                         0.87
 -----------------------------------

在这个数据库中,我需要通过创建多个列来简化报告。 我试图实现的算法是,如果我可以根据空行将文件拆分为更小的部分,我可以将数据库读入二维数组,最后将数据转储为我选择的格式。 因此,第一个要求是了解我是否可以根据空行拆分文件以进行进一步处理。

我预期的最终结果是

              A1      A2     B1
 Height:     24.00  20.00   4.00
 Width:       1.00   4.00   4.50
 Depth:       0.04   0.54   0.87

任何建议/线索将不胜感激。

【问题讨论】:

    标签: regex perl parsing


    【解决方案1】:

    使用“段落模式”可以很容易地分割文件以进行基于空白行的处理。

    local $/ = "";
    while (my $block = <>) {
       ...
    }
    

    但不这样做更容易。

    my $block;
    my $data;
    while (<>) {
       if (/^Block:\s*(\S+)/) {
          $block = $1;
       }
       elsif (/^(\S+):\s*(\S+)/) {
          $data{$1}{$block} = $2;
       }
    }
    

    【讨论】:

      【解决方案2】:
      while(<>)
      {
      push @B,$1 if(/Block:\s*(\S*)/);
      push @H,$1 if(/Height:\s*(\S*)/);
      push @W,$1 if(/Width:\s*(\S*)/);
      push @D,$1 if(/Depth:\s*(\S*)/);
      }
      
      print "\t\t @B \n";
      print "Height @H \n";
      print "Width @W \n";
      print "Depth @D \n";
      

      测试Here

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-03-06
        • 1970-01-01
        • 2015-08-15
        相关资源
        最近更新 更多