1

私はこのようなデータを持っています:

Re: Building A

Month
kWh
1
100
2
110
3
105


Re: Building B

Month
kWh
1
200
2
210
3
205

建物ごとに1つずつ複数のテキストファイルに変換したいと思います。私の計画は次のとおりです。

  1. 建物の区切り線の間の値を抽出します
  2. 行をテーブルに変換します

タスク(1)では、次のようなフリップフロップ演算子を使用しようとしました。

while( <DATA> ) {
  next unless /^Re: Building A/ .. /^Re: Building B/;
  my $line = $_;
  print $line;
}

ただし、上記では建物Aのデータのみが表示されるため、機能しません。データは複数の建物(約50棟)のものであるため、これをいくらか再帰的に行う必要があります。私はタスク(2)を始めていません。

どんな助けでもありがたいです。

4

3 に答える 3

4

私はこのようなことをします:

#!/usr/bin/perl
use strict;
use warnings;

my %buildings;

while (<DATA>) {
    chomp;
    $buildings{$1} = [] if /^Re: Building ([AB])/;
    push @{$buildings{$1}}, $_ if $_;
}

while (my ($building, $data) = each %buildings) {
    open(my $out, '>', "$building.txt") or die "Unable to open file for writing: $!\n";

    for my $i (1 .. $#$data / 2) {
        print $out sprintf "%s\t%s\n", $data->[$i*2-1], $data->[$i*2];
    }
    close $out;
}

A.txt:

Month   kWh
1       100
2       110
3       105

B.txt:

Month   kWh
1       200
2       210
3       205
于 2012-04-24T08:03:31.943 に答える
2

あなたはテーブルでうまくいくかもしれないと思うので、私はあなたが尋ねることと私が良いと思うことの両方を行う方法をあなたに示します。

$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
于 2012-04-24T07:07:43.487 に答える
0

Pythonでは、テキストファイルをデータ構造に解析してから、asciitablesを使用して出力します。理想的には、文字列を直接操作するのではなく、解析してから、個別のアクションとして表示することをお勧めします。

解析をどの程度正確に行うかは、ファイルの形式がどれほど規則的であるか、ファイルの間違いやタイプミスに耐える必要があるかどうかなどの要因によって異なります。

于 2012-04-24T03:53:42.680 に答える