我正在比较两个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 template
和name
,这应该添加。我可以这样做吗?
ipaddress
答案 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”)或检查输入更改为显式循环。以这种方式分配散列也假设唯一的名称(名称只出现在一行上)。
这假定文件不是很大,因为它们都是先读取
问题中的代码完全被破坏,基本语法错误。在得出结论失败之前,请务必清理代码。如果这是发布的问题,请尽力使用您发布的内容。