【问题标题】:Compare all the CSV files in a folder and print duplicate rows比较文件夹中的所有 CSV 文件并打印重复的行
【发布时间】:2015-03-14 12:17:14
【问题描述】:

我在一个文件夹中有多个 CSV 文件,我想比较并打印匹配的行(列数可能不同)。我知道如何在文件中获取重复项,但这种情况有点不同。假设一个文件夹中有两个文件,我想比较它们。

CSV1:
H1,H2,H4
C01,23,F
C2,45,M

CSV2:
H1,H2,H3,H4
C01,23,data,F
C01,23,some other data,M
C4,34,data,M

我需要我的输出来检查所有可用数据(来自列数最少的数据)是否与同一文件夹中的另一个文件完全匹配。我的输出可能像

CSV1,CSV2 (H1:C01,H2:23,H4:F(H3:data))

【问题讨论】:

    标签: python csv duplicates rows


    【解决方案1】:

    类似的东西呢:

    def duplines(csv_least_cols, csv_most_cols):
        rowset = set()
        with open(csv_least_cols) as csv1:
            r = csv.reader(csv1)
            csv1_cols = next(r)
            for row in r:
                rowset.add(tuple(row))
        with open(csv_most_cols) as csv2:
            dr = csv.DictReader(csv2)
            for drow in dr:
                refcols = tuple(drow[c] for c in csv1_cols)
                if refcols in rowset: yield csv1_cols, refcols, drow
    

    您可以在循环中调用它并执行您想要的任何格式化 - 这个生成器处理底层逻辑,将格式化任务分离给它的调用者。

    因此,例如,要获得您想要的 CSV1,CSV2 (H1:C01,H2:23,H4:F(H3:data)) 样式输出,您可以...:

    def formatit(csv_least, csv_most):
        out_start = '{},{} ('.format(csv_least, csv_most)
        for c1cols, refvals, c2dict in duplines(csv_least, csv_most):
            out_middle = []
            for c, v in zip(c1cols, refvals):
                out_middle.append('{}:{}'.format(c, v))
            out_end = []
            for c in c2dict:
                if c in c1cols: continue
                out_end.append('{}:{}'.format(c, c2dict[c]))
            out = '{}{}({}))'.format(out_start, ','.join(out_middle), ','.join(out_end))
            print(out)
    

    您会注意到格式化工作比实际逻辑复杂得多(因此更有可能隐藏错误:-),这就是为什么我将您所需的格式称为“特殊”。

    但我希望这至少可以帮助您入门(您可以分别尝试每个功能,确保逻辑符合您的要求,然后再担心格式:-)。

    【讨论】:

    • 谢谢。我会试试这个并更新你。无论如何,格式并不重要。
    猜你喜欢
    • 1970-01-01
    • 2015-01-20
    • 1970-01-01
    • 1970-01-01
    • 2013-01-05
    • 2014-07-18
    • 1970-01-01
    • 2020-08-09
    • 2022-01-25
    相关资源
    最近更新 更多