3

我目前正在使用一个名为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 有一些经验,但想指出一些初始方向。

4

3 回答 3

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

这实际上比 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")
于 2013-03-04T11:06:49.957 回答
1

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

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

哈雷尔·本-阿提亚

于 2014-03-15T12:21:49.463 回答
1

如果您可以进行不区分大小写的比较,并且如果 File2.csv 中没有必须在 File1.csv 中匹配的重复项,并且如果 File1.csv 不包含\\or \",那么您只需要一个简单的 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 错误:当有多个大小不同的区分大小写的文字搜索字符串时,它可能无法找到匹配项。不区分大小写选项避免了该错误。请参阅为什么这个具有多个文字搜索字符串的 FINDSTR 示例找不到匹配项?了解更多信息。

\\如果 File2.csv 包含或\"因为 FINDSTR 将它们分别视为\和 ,则搜索将无法正常工作"。请参阅Windows FINDSTR 命令有哪些未记录的功能和限制?了解更多信息。接受的答案有部分描述 FINDSTR 转义序列大约一半。

于 2013-03-04T12:22:11.283 回答