比较

2013-03-04 102 views
1

我目前使用的叫做TableTexCompare比较

此工具在Windows实用程序可以采取2个CSV文件,并比较他们的CSV文件。关于它的好处是它可以进行比较,即使2个文件的记录没有按照相同的顺序排序或者这些字段的排列顺序不同。

因此,下面的两个文件将导致一个成功的比较

(File1.csv)

FirstName,LastName,Age 
Mona,Sax,30 
Max,Payne,43 
Jack,Lupino,50 

(File2.csv)

FirstName,Age,LastName 
Max,43,Payne 
Jack,50,Lupino 
Mona,30,Sax 

什么我要找是从命令行做同样的事情,只有一个区别: 我想比较只在一个方向上执行,即如果File2.csv如下(一个子集File1.csv),比较应通过

(File2.csv)

FirstName,Age,LastName 
Jack,50,Lupino 

我并不特别在意,如果它要在一些编程语言,有专门的CLI工具或shell脚本(如使用awk)。我对Java和Groovy有一些经验,但希望指出一些初始方向。

回答

3

我可以提供一个Python的解决方案:

import csv 
with open("file1.csv") as f1, open("file2.csv") as f2: 
    r1 = list(csv.DictReader(f1)) 
    r2 = csv.DictReader(f2) 
    for item in r2: 
     if not item in r1: 
      print("r2 is not a subset of r1!") 
      break 

这实际上是有点比在Python必要的(但更容易理解)更详细的;我个人会用生成器表达式:

import csv 
with open("file1.csv") as f1, open("file2.csv") as f2: 
    r1 = list(csv.DictReader(f1)) 
    r2 = csv.DictReader(f2) 
    if all(item in r1 for item in r2): 
     print("r2 is a subset of r1") 
+0

我对Python在Python中的代码有多么细小和易于阅读印象深刻。 – 2013-03-04 13:16:45

+0

@ArgyriosTakakas:它可以更简化;看看我的编辑:) – 2013-03-04 13:50:56

0

如果你能负担得起做一个区分大小写的比较,如果有内File2.csv没有重复那必须在File1.csv匹配,如果文件1。 csv不包含\\\",那么您只需要一个简单的FINDSTR命令。

在File2.csv下面将列出行没有出现在File1.csv:

findstr /vxig:"File1.csv" "File2.csv" 

如果你想要的是一个迹象File1.csv是否File2.csv的超集,然后

findstr /vxig:"File1.csv" "File2.csv" >nul && (echo File1 is NOT a superset of File2) || (echo File1 IS a superset of File2) 

除非存在令人讨厌的FINDSTR错误,否则搜索不应该区分大小写:当存在多个不同大小的区分大小写的文字搜索字符串时,它可能无法找到匹配项。不区分大小写的选项可以避免该错误。有关更多信息,请参阅Why doesn't this FINDSTR example with multiple literal search strings find a match?

如果File2.csv包含\\\"因为FINDSTR将它们分别当作\"搜索将无法正常工作。有关更多信息,请参见What are the undocumented features and limitations of the Windows FINDSTR command?。接受的答案部分描述了大约一半的FINDSTR转义序列。

+1

它看起来像findstr的限制不会影响我的情况,但我只是使用与上面的Python脚本一起使用的相同的2个文件尝试命令,我得到了错误的结果(该File1不是一个超集文件2) – 2013-03-04 13:31:35

+0

@ArgyriosTzakas - Doh,你是。我有一个愚蠢的错误,我错误地将File1与File2交换。我已经更新并修复了答案。 – dbenham 2013-03-04 15:02:46

0

您可以查看q - Text as a Database,它允许直接在csv文件(包括连接)上执行SQL。这将允许轻松地进行比较,以及更多,比如匹配特定的列以实现相等性,并从不匹配的行中获取特定列。

完全公开 - 这是我自己的开源工具。

Harel Ben-Attia