【问题标题】:Compare CSV files比较 CSV 文件
【发布时间】:2013-03-04 10:53:58
【问题描述】:

我目前正在使用一个名为 TableTexCompare 的 Windows 实用程序

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

因此,以下 2 个文件将导致成功比较

(文件1.csv)

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

(文件2.csv)

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

我正在寻找的是从命令行做同样的事情,只有 1 个区别: 我希望仅在一个方向上进行比较,即如果 File2.csv 如下(File1.csv 的子集),则比较应该通过

(文件2.csv)

FirstName,Age,LastName
Jack,50,Lupino

我并不特别关心它是使用某种编程语言、专用 cli 工具还是 shell 脚本(例如使用 awk)。我对 Java 和 Groovy 有一定的经验,但希望得到一些初步的指导。

【问题讨论】:

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


    【解决方案1】:

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

    【讨论】:

    • Python 中的代码如此小巧易读,给我留下了深刻的印象。
    • @ArgyriosTzakas:可以进一步简化;看我的编辑:)
    【解决方案2】:

    如果您可以进行不区分大小写的比较,并且如果 File2.csv 中没有必须在 File1.csv 中匹配的重复项,并且如果 File1.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 转义序列大约一半。

    【讨论】:

    • 看起来 findstr 的限制不会影响我的情况,但我只是使用与上面 Python 脚本一起使用的 2 个文件尝试了该命令,但结果错误(即 File1 不是File2) 的超集
    • @ArgyriosTzakas - 嗯,没错。我有一个愚蠢的错误,我错误地将 File1 与 File2 交换。我已经更新并修复了答案。
    【解决方案3】:

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

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

    哈雷尔·本-阿提亚

    【讨论】:

      猜你喜欢
      • 2021-02-16
      • 2023-03-15
      • 1970-01-01
      • 2022-01-04
      • 2019-01-19
      • 2021-03-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多