比较 csv 文件中的值



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

输出 1.csv(名称、IP)- 主系统


Test1, 10.56.7.13
Test2, 10.56.4.14
Test3, 10.56.5.15

输出2.csv (id,名称,ip) - 辅助系统


1234,Test1, 10.56.7.13
1235,Test2, 10.56.4.10

我的结果应该是:我对Test1什么都不做(因为它已经在系统 2 中),我应该更新Test2(因为现在我有一个不同的 IP 地址),我应该添加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_secondn";
if ( $first{$name_first} eq $first{$name_second} &&  
$first{$ip_first} ne $first{$ip_second}) 
{   
print "It should be done UPDATE for $name_secondn";
else
print "Devices should be added: $name_firstn"
$second{$name_second}++;
}   
}   
}
close $output_2;

我在此行收到错误if ( $first{$name_first} e.g. $first{$name_second}.我认为我的比较是错误的 - 有更好的方法吗?

还有一个问题:对于更新(PUT 请求),我需要单独的密钥。因为我需要URLid,我需要投入XML templatenameipaddress,应该添加。我可以这样做吗?

else {
say "UPDATE need be done for $second{$name}";
my $xml = XML::Twig -> new -> parsefile ( 'template.xml' );
$xml ->set_pretty_print('indented_a');
open ( my $input, '<', 'output2.csv' ) or die $!;
while ( <$input> ) { 
chomp; 
my $id, my $name, $second{$name} = split /,/; 
$xml -> root -> set_att('name', $name ); 
$xml -> get_xpath('//ipaddress',0) -> set_text($second{$name}); 
my $uri="https://hostname:9060/ers/config/networkdevice/$id";

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

请注意,使用 CSV 模块(如 Text::CSV)比手动使用要好得多;否则很有可能出现麻烦。例如,请参阅本文中的答案。 我将你的方法保留在下面,只是为了专注于实际处理。

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}"
}   
}   

这打印

找到匹配项 测试1, 10.56.7.13 需要对 10.56.4.10 进行更新 应添加设备: 测试3

评论

  • 我已将文件名更改为词法变量,因为我看不到为此使用constant

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

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

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

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

相关内容

  • 没有找到相关文章

最新更新