2013-12-19 64 views
0

我有這個代碼比較兩個示例文本文件並報告任何數字不匹配。2文本文件比較和識別不匹配的類型

文本1:

C_A C_A 0.0000 0.0000 0 0 50 47 100 390 
C_A/I0/I2 INV 1.0400 0.2210 0 0 530 200 250 261 
C_A/I0/I0 INV 0.0200 0.2210 0 0 20 200 30 100 

文本2:

C_A C_A 0.0000 0 0 0 50 47 100 390 
C_A/I0/I0 INV 0.0200 0.2213 0 0 20 200 40 100 
C_A/I0/I2 INV 1.00 0.2210 1 1 535 200.00 250 261 

代碼:

use strict; 
use warnings; 

my %ref_data; 

open my $fh, '<', 'Text1' or die "Could not open to read: $!"; 
while (<$fh>) { 
    chomp; 
    my ($occurname, $tempname, @data1) = split; 
    $ref_data{$occurname} = \@data1; 
} 

open $fh, '<', 'Text2' or die "Could not open to read: $!"; 
while (<$fh>) { 
    my ($occurname, $tempname, @data2) = split; 
    my $data1 = $ref_data{$occurname}; 

    for (0 .. $#data2) { 
    if ($data1->[$_] != $data2[$_]) { 
     print "$occurname $tempname has mismatch property\n"; 
     last; 
    } 
    } 
} 

輸出:

C_A/I0/I0 INV has mismatch property 
C_A/I0/I2 INV has mismatch property 

我想增加我的代碼,其中@data的內容在下面的順序($x_os $y_os $reflection $rotation @nodes)與錯誤消息一起輸出以方便用戶進行調試。

所需的輸出:

C_A/I0/I0 INV has mismatch property (y_os,nodes) 
C_A/I0/I2 INV has mismatch property (x_os,reflection,rotation,nodes) 
+1

變量'$ x_os','$ y_os','$ reflection','$ rotation'和'@ nodes'不會出現在你的代碼,而且沒有證據表明你的意思是什麼。雖然我可以猜出你的意圖,但如果你自己解釋它會容易得多。 '@ data'數組包含八個數字。你是說前四個是'$ x_os','$ y_os','$ reflection'和'$ rotation',最後四個是「@ nodes」嗎? – Borodin

+0

是的,你是對的。這些變量表示@data的內容。 – annel

回答

1

因爲我假定的意思給您需要的輸出,我張貼這種解決方案。

的主要區別在於,而不是打印的消息,並儘快任何發現差別時移動到下一個散列元件,它比較字段的所有和上推任何不同字段的名稱陣列@diffs。如果@diffs不爲空,則在全部之後進行比較。

use strict; 
use warnings; 

my %ref_data; 

open my $fh, '<', 'Text1' or die "Could not open to read: $!"; 
while (<$fh>) { 
    chomp; 
    my ($occurname, $tempname, @data1) = split; 
    $ref_data{$occurname} = \@data1; 
} 

my @fields = qw/ x_os y_os reflection rotation /; 

open $fh, '<', 'Text2' or die "Could not open to read: $!"; 
while (<$fh>) { 
    chomp; 
    my ($occurname, $tempname, @data2) = split; 
    my $data1 = $ref_data{$occurname}; 

    my @diffs; 

    for my $i (0 .. $#data2) { 
    if ($data1->[$i] != $data2[$i]) { 
     if ($i < 4) { 
     push @diffs, $fields[$i]; 
     } 
     else { 
     push @diffs, 'nodes'; 
     last; 
     } 
    } 
    } 

    printf "%s %s has mismatch property (%s)\n", $occurname, $tempname, join(', ', @diffs) if @diffs; 
} 

輸出

C_A/I0/I0 INV has mismatch property (y_os, nodes) 
C_A/I0/I2 INV has mismatch property (x_os, reflection, rotation, nodes) 
+0

欣賞你的努力。感謝您的快速回復和提示。它工作正常。 – annel