我的数据看起来像这样
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
这需要在不事先了解商店或订单的情况下完成。
实际上,这个问题中唯一困难的部分是将数据分成四行块 - 我该怎么做?
答案 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),其中键是业务名称,关联值是对数量列表的引用。
结果为sort
和print
,按降序排列,按金额计算。
希望这有帮助!
答案 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";
}