2013-12-19 2 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', а конечные четыре соответствуют «@ node»? – 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

Смежные вопросы