我想比较两个文件:行和列。下面是一个示例文件:
-------------------------------DATAo.csv
20150714 00:08:49
default, ame_a, ame_m, ame_uc, a me_f, ams_l, enced_affi,
DPA01, fault, fault, fault, fault, fault, 1,
DPA02, , , , , fault, 1,
DPA03, fault, fault, olt, fault, fault, 1,
DPA01, fault, at, fault, 2, fault, 1,第二行只有两行数据
--------------------------------DATA1.csv
20150616 22:16:09
default, ame_a, ame_m, ame_uc, ame_f, ams_l, enced_affi,
default, fault, fault, fault, fault, fault, 1,比较行=h(这就是我的代码目前所执行的)
代码应该放在DATA1.csv中他跳过了日期和参数的第一行,并取最后一行,即错误,1,并保留名称"default“当它有这一行时,它进入文件DATA0.csv他第一次比较时,留下了前两行(日期和参数)
他厌倦了第1行系统的名称,即DPA01
fault, fault, fault, fault, fault, 1,
fault, fault, fault, fault, fault, 1,
=> not different第2行
fault, fault, fault, fault, fault, 1,
, , , , fault, 1,
=> different第3行
fault, fault, fault, fault, fault, 1,
fault, fault, olt, fault, fault, 1,
=> different第4行
fault, fault, fault, fault, fault, 1,
fault, at, fault, 2, fault, 1,
=> different比较列
代码在DATA1.csv文件中,如果有“错误”,则查找第一个参数的名称,即ame_a文件中的返回值,如果有不同的值,则查找ame_a下面的DATA0.csv。
DPA01, fault,
DPA02, ,
DPA03, fault,
DPA01, fault,在物种的情况下,我们看到名为DPA2的系统并不重视这一点,这表明存在差异。然后concidere第二个参数,即ame_m这个参数拥有文件DATA1.csv中的“错误”值将代码返回到DATA0.csv文件中,并查看是否有任何资本收益等于案例中的“错误”种类
DPA01, fault,
DPA02, ,
DPA03, fault,
DPA01, at,我们注意到这是不等价的,以此类推。最后他给了我一个这样的结果。
false, false, false, false, true, true,
default, ame_a, ame_m, ame_uc, ame_f, ams_l, enced_affi,
true DPA01, fault, fault, fault, fault, fault, 1,
false DPA02, , , , , fault, 1,
false DPA03, fault, fault, olt, fault, fault, 1,
false DPA01, fault, at, fault, 2, fault, 1,不同系统数量=3参数数量=4名称为:
ame_a
ame_m
ame_uc
ame_f正如您在下面注意到的,如果代码已经是练习的一部分,并且我被阻止了一段时间,那么这是一个试用期。我请求你的帮助。谢谢
use strict;
use warnings;
use File::Compare;
my %exclude;
.
my $file1 = $ARGV[0] || die "Unable to open file";
my $file2 = $ARGV[1] || die "Unable to open file";
my $txtdatei = $ARGV[2] || 'compare.csv';
my $compare = compare($file2, $file1);
open my $file, '<', $file1 or die $!;
while (<$file> ) {last if (/^\d+\s+\d{2}:\d{2}:\d{2}\s*$/)}
while (<$file>) {
chomp;
$exclude{$_}++;
}
open my $txtfh, '>', $txtdatei or die "Unable to open file";
open $file, '<', $file2 or die "Unable to open file";
while (<$file> ) {last if (/^\d+\s+\d{2}:\d{2}:\d{2}\s*$/)}
while (<$file>) {
chomp;
if($compare == 1){
print $txtfh "FALSE! $_\n" unless $exclude{$_};
}
elsif($compare == 0){
print $txtfh "True! the Files are equal \n";
}
}
close $txtfh;发布于 2015-07-29 08:38:38
为了清楚起见,您希望查找DATAo.csv上包含相同值的所有列,以及DATAo.csv中与DATA1.csv中的最后一行匹配的所有行。
从你的代码中可以清楚地看出,你是编程的新手,核心思想已经存在,只是缺乏经验。
首先,File::Compare可能不会像你想的那样做,它不能以你想要的方式比较CSV文件中的数据。你必须把这种逻辑建立在你自己身上。
其次,我建议你阅读有关数组的知识,这是解决这个特殊问题的关键组件,看看;
要开始解决问题,请将csv加载到一个二维数组中,通常采用datarow格式,例如;
my @DATAo;
open($fhDATAo, '<', $file) or die "Can't open $file: $!\n";
while (<$fhDATAo>) { push @DATAo, [split /,/]; }你现在可以使用不同的函数来操作你的数组,见下面的例子。
使用splice删除任何不需要的行,请参见http://perlmaven.com/how-to-eliminate-a-value-in-the-middle-of-an-array-in-perl
splice(@DATAo, 0, 1); # Removed the first row using splice(var, position, length)查看数据并对其执行一些逻辑。
foreach my $row in (@DATAo) {
foreach my $col in (@$row) {
print "Do something with $row and $col";
}
}从上面的示例中,您应该能够加载DATA1.csv并执行必要的操作。
如果您需要任何进一步的帮助,请更新源代码。
https://stackoverflow.com/questions/31688466
复制相似问题