解析重复4个线组的数据

时间:2014-02-11 02:56:42

标签: perl

我的数据看起来像这样

02/06/2014  

VONS STORE
-$5.95

02/06/2014  

VONS STORE
-$3.99

02/06/2014  

VONS STORE
-$3.70

02/05/2014  

VONS STORE
-$8.99

02/05/2014  

VONS STORE
-$6.97

02/04/2014  

MISSION HI
-$5.74

02/03/2014  

R K SUSHI
-$34.23

01/30/2014  

MISSION HI
-$9.94

我如何将其分成如下数据:

VONS STORE (5x): $29.6
MISSION HI (2x): $15.68
R K SUSHI  (1x): $34.23

这需要在不事先了解商店或订单的情况下完成。

实际上,这个问题中唯一困难的部分是将数据分成四行块 - 我该怎么做?

3 个答案:

答案 0 :(得分:2)

一次循环文件一行,并跟踪缓冲区中读取的最后4行,然后刷新:

#!/usr/bin/perl
use v5.14;

open(IN, "<", "mydata.txt");

my @lineBuffer = ();
my %prices;
my %number;
while (<IN>) {
    chomp();
    if (@lineBuffer < 4) {
        push(@lineBuffer, $_);
    } else {
        my $price = @lineBuffer[3];
        $price =~ s/-\$//; 
        $prices{@lineBuffer[2]} += $price;
        $number{@lineBuffer[2]}++;
        @lineBuffer = ();
    }
}

for my $key (keys %number) {
    say $key." (".$number{$key}."x): ".'$'.$prices{$key}
}

close(IN);

答案 1 :(得分:0)

也许以下内容会有所帮助:

use strict;
use warnings;
use List::Util qw/sum/;

local $/ = '';
my %h;

while (<>) {
    next if $. % 2;
    push @{ $h{$1} }, $2 if /(.+)\n-?\$(.+)/;
}

print "$_ (" . @{ $h{$_} } . 'x): $' . ( sum @{ $h{$_} } ), "\n"
  for sort { @{ $h{$b} } <=> @{ $h{$a} } } keys %h;

用法:perl script.pl inFile [>outFile]

最后一个可选参数将输出定向到文件。

数据集输出:

VONS STORE (5x): $29.6
MISSION HI (2x): $15.68
R K SUSHI (1x): $34.23

由于有空行,因此设置了段落模式($/ = '')的读数。通过捕获业务名称和金额,仅处理偶数段落。使用数组哈希(HoA),其中键是业务名称,关联值是对数量列表的引用。

结果为sortprint,按降序排列,按金额计算。

希望这有帮助!

答案 2 :(得分:0)

第一个捕获匹配名称,第二个匹配金额,哈希并打印

#!/usr/bin/perl

open(IN, "<", "data.txt");
my %r;
my %t;
my $data = join "",(<IN>);

while( $data =~ /^([^\n\d]+)\n.*?^(-?)\$([\.\d]+)/img) {
  $r{$1}++;
  $t{$1} += $3;
}

foreach (keys %r){ 
   my $o = sprintf("%-15.15s(%dx): \$%02.2f",$_,$r{$_},$t{$_}); 
   print "$o\n"; 
}