比较CSV文件

时间:2013-03-04 10:53:58

标签: csv command-line comparison command-line-interface

我目前正在使用名为TableTexCompare

的Windows实用程序

此工具可以获取2个CSV文件并进行比较。关于它的好处是它可以进行比较,即使2个文件的记录没有以相同的顺序排序或者字段没有按相同的顺序排列。

因此,以下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 个答案:

答案 0 :(得分:4)

我可以提供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")

答案 1 :(得分:0)

如果您能够进行不区分大小写的比较,并且File2.csv中没有重复项必须在File1.csv中匹配,并且File1.csv不包含\\或{{1那么你需要的只是一个简单的FINDSTR命令。

以下将列出File2.csv中未出现在File1.csv中的行:

\"

如果您想要的是File1.csv是否是File2.csv的超集,那么

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

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

如果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会将它们分别视为\"\。有关详细信息,请参阅What are the undocumented features and limitations of the Windows FINDSTR command?。接受的答案有一些描述FINDSTR逃逸序列的部分大约一半。

答案 2 :(得分:0)

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

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

Harel Ben-Attia