我认为你可能会用一张桌子做得很好,所以我会告诉你如何做你要求的和我认为好的。
$name = "";
$data = {};
open(IN, "build.txt");
foreach my $line (<IN>){
if($line =~ /Re: (.*)\n/) { # get building name
$name = $1;
$name =~ s/ /_/;
$data->{$name} = []; # link to empty array
} else {
# make a new list and return to a list
@{$data->{$name}} = (@{$data->{$name}}, $line); # add line to current building data
}
}
close IN;
#
# write on file for each
#
foreach my $name (keys %{$data}){
open(OUT, ">$name.txt");
foreach my $line (@{$data->{$name}}){
print OUT $line;
}
close OUT;
}
#
# or write into one file as a table
#
open(OUT, ">tabledata.txt");
foreach my $name (keys %{$data}){
# because the data was not filtered on import we filter it now
my $flag = 0;
my @data;
foreach my $line (@{$data->{$name}}){
if($line =~ /kWh/) {
$flag = 1;
} elsif($line =~ /^\n$/){ # skip blanks
} elsif($flag == 1) { # skip the counters
$flag++;
} elsif($flag > 1) {
chomp($line);
@data = (@data, $line);
$flag = 1;
}
}
# print pretty rows
my $format = "%20s" . ("%10d" x @data);
print OUT sprintf($format, $name, @data) . "\n";
}
close OUT;
这会为每个建筑物创建一个带有建筑物名称的文件。Building_A.txt 的一个示例是:
Month
kWh
1
100
2
110
3
105
表文件名为 tabledata.txt,如下所示:
Building_A 100 110 105
Building_B 200 210 205