比较csv文件中的值

时间:2018-02-05 18:36:40

标签: perl csv parsing compare

我正在比较两个csv文件中的不同值。如果我没有匹配项,我想在管理系统中添加(或更新)我的设备。

output1.csv(name,ip) - 主系统

 Test1, 10.56.7.13
 Test2, 10.56.4.14
 Test3, 10.56.5.15

output2.csv(id,name,ip) - 辅助系统

 1234,Test1, 10.56.7.13
 1235,Test2, 10.56.4.10

我的结果应该是:我对Test1不做任何事情(因为它已经在系统2中),我应该更新Test2(因为现在我有一个不同的IP地址)我应该添加{ {1}},因为我在辅助系统中没有它。

Test3

我在此行use strict; use warnings; use feature qw(say); use autodie; use constant { FILE_1 => "output1.csv", FILE_2 => "output2.csv", }; my %first; my $name_first; my $ip_first; open my $output_1, "<", FILE_1; while ( <$output_1> ) { chomp; ($name_first, $ip_first) = split /,/; #/ $first{$name_first}=1; $first{$ip_first}=1; } close $output_1; my %second; open my $output_2, "<", FILE_2; while ( <$output_2> ) { chomp; my ($id_second,$name_second,$ip_second) = split /,/; if ( $first{$name_first} && $first{$ip_second} ) { print "Match found $name_second, $ip_second\n"; if ( $first{$name_first} eq $first{$name_second} && $first{$ip_first} ne $first{$ip_second}) { print "It should be done UPDATE for $name_second\n"; else print "Devices should be added: $name_first\n" $second{$name_second}++; } } } close $output_2; 收到错误。我认为我的比较是错误的 - 有更好的方法吗?

还有一个问题:对于UPDATE(PUT请求),我需要单独的密钥。因为我需要if ( $first{$name_first} e.g. $first{$name_second}中的id,我需要加入URL XML templatename,这应该添加。我可以这样做吗?

ipaddress

1 个答案:

答案 0 :(得分:2)

对于所描述的任务,您需要将第二个文件的每一行与第一个文件中的所有name-ip进行比较,从而将其所有行进行比较。一种有效的方法是首先为每个文件构建哈希值。

请注意,使用CSV 模块比Text::CSV更好,而不是手动执行;否则就有很多麻烦。例如,请参阅this post中的答案。 我保持你的方法仅仅是为了专注于实际处理。

use strict;
use warnings;
use feature qw(say);

my ($file_1, $file_2) = ('output1.csv', 'output2.csv');

open my $fh, '<', $file_1  or die "Can't open $file_1: $!";
my %first = map { chomp; split /\s*,\s*/ } <$fh>;            #/

open    $fh, '<', $file_2  or die "Can't open $file_2: $!";
my %second = map { chomp; (split /\s*,\s*/)[1,2] } <$fh>;
close $fh;

foreach my $name (sort keys %first) {
    if (not exists $second{$name}) {
        say "Devices should be added: $name";
        next;
    }

    if ($first{$name} eq $second{$name}) {
        say "Match found $name, $first{$name}";
    }
    else {
        say "UPDATE need be done for $second{$name}"
    }   
}   

打印

Match found Test1, 10.56.7.13
UPDATE need be done for 10.56.4.10
Devices should be added: Test3

评论

  • 我已将文件命名更改为词汇变量,因为我没有看到使用constant进行此操作

  • 我使用一个文件句柄,重新打开时会关闭(对于第二个文件)

  • 当每行split时,返回的对直接分配哈希值。如果您需要更多处理(可能是第二个文件的“id”)或检查输入更改为显式循环。以这种方式分配散列也假设唯一的名称(名称只出现在一行上)。

  • 这假定文件不是很大,因为它们都是先读取

问题中的代码完全被破坏,基本语法错误。在得出结论失败之前,请务必清理代码。如果这是发布的问题,请尽力使用您发布的内容。