首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >比较2个文件(行和列)

比较2个文件(行和列)
EN

Stack Overflow用户
提问于 2015-07-29 06:51:27
回答 1查看 62关注 0票数 0

我想比较两个文件:行和列。下面是一个示例文件:

-------------------------------DATAo.csv

代码语言:javascript
复制
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

代码语言:javascript
复制
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

代码语言:javascript
复制
fault, fault, fault, fault, fault, 1, 
fault, fault, fault, fault, fault, 1,

=> not different

第2行

代码语言:javascript
复制
fault, fault, fault, fault, fault, 1, 
     ,      ,      ,      , fault, 1,

=>  different

第3行

代码语言:javascript
复制
fault, fault, fault, fault, fault, 1, 
fault, fault,   olt, fault, fault, 1,

=>  different

第4行

代码语言:javascript
复制
fault, fault, fault, fault, fault, 1, 
fault,    at, fault,     2, fault, 1,

=> different

比较列

代码在DATA1.csv文件中,如果有“错误”,则查找第一个参数的名称,即ame_a文件中的返回值,如果有不同的值,则查找ame_a下面的DATA0.csv。

代码语言:javascript
复制
DPA01,  fault, 
DPA02,       ,      
DPA03,  fault,  
DPA01,  fault,

在物种的情况下,我们看到名为DPA2的系统并不重视这一点,这表明存在差异。然后concidere第二个参数,即ame_m这个参数拥有文件DATA1.csv中的“错误”值将代码返回到DATA0.csv文件中,并查看是否有任何资本收益等于案例中的“错误”种类

代码语言:javascript
复制
DPA01,  fault,  
DPA02,       ,  
DPA03,  fault,   
DPA01,     at,

我们注意到这是不等价的,以此类推。最后他给了我一个这样的结果。

代码语言:javascript
复制
              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名称为:

代码语言:javascript
复制
ame_a
ame_m 
ame_uc 
ame_f

正如您在下面注意到的,如果代码已经是练习的一部分,并且我被阻止了一段时间,那么这是一个试用期。我请求你的帮助。谢谢

代码语言:javascript
复制
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;
EN

回答 1

Stack Overflow用户

发布于 2015-07-29 08:38:38

为了清楚起见,您希望查找DATAo.csv上包含相同值的所有列,以及DATAo.csv中与DATA1.csv中的最后一行匹配的所有行。

从你的代码中可以清楚地看出,你是编程的新手,核心思想已经存在,只是缺乏经验。

首先,File::Compare可能不会像你想的那样做,它不能以你想要的方式比较CSV文件中的数据。你必须把这种逻辑建立在你自己身上。

其次,我建议你阅读有关数组的知识,这是解决这个特殊问题的关键组件,看看;

  • http://perlmaven.com/perl-arrays
  • http://perlmaven.com/multi-dimensional-arrays-in-perl
  • http://perlmaven.com/splice-to-slice-and-dice-arrays-in-perl

要开始解决问题,请将csv加载到一个二维数组中,通常采用datarow格式,例如;

代码语言:javascript
复制
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

代码语言:javascript
复制
splice(@DATAo, 0, 1); # Removed the first row using splice(var, position, length)

查看数据并对其执行一些逻辑。

代码语言:javascript
复制
foreach my $row in (@DATAo) {
 foreach my $col in (@$row) {
   print "Do something with $row and $col";
 }
}

从上面的示例中,您应该能够加载DATA1.csv并执行必要的操作。

如果您需要任何进一步的帮助,请更新源代码。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31688466

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档