比较 CSV 文件

Arg*_*kas 3 csv comparison command-line command-line-interface

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

该工具可以获取 2 个 CSV 文件并进行比较。它的好处是,即使两个文件的记录排序不一样或者字段的位置不一样,它也可以进行比较。

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

(文件1.csv)

FirstName,LastName,Age
Mona,Sax,30
Max,Payne,43
Jack,Lupino,50
Run Code Online (Sandbox Code Playgroud)

(文件2.csv)

FirstName,Age,LastName
Max,43,Payne
Jack,50,Lupino
Mona,30,Sax
Run Code Online (Sandbox Code Playgroud)

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

(文件2.csv)

FirstName,Age,LastName
Jack,50,Lupino
Run Code Online (Sandbox Code Playgroud)

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

Tim*_*ker 5

我可以提供一个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
Run Code Online (Sandbox Code Playgroud)

这实际上比 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")
Run Code Online (Sandbox Code Playgroud)