Python 比较多个csv文件并查找匹配项

Python 比较多个csv文件并查找匹配项,python,optimization,csv,large-files,multiple-databases,Python,Optimization,Csv,Large Files,Multiple Databases,我有两个带有csv文件的文件夹。一组“主”文件和一组“不匹配”文件。在主文件中(约25个文件,总共约50000行),有唯一的ID。每行不匹配的文件(约250个文件,总共约700000行)中应有一个id,该id与其中一个主文件中的单个id相匹配。在每个不匹配的文件中,所有id都应与单个主文件匹配。此外,不匹配的主机中的所有ID都应位于单个主机中 不幸的是,这些列并不总是一致的,id字段可能出现在第[2]行或第[155]行中。(为此我使用python)我最初使用set.intersection并查找

我有两个带有csv文件的文件夹。一组“主”文件和一组“不匹配”文件。在主文件中(约25个文件,总共约50000行),有唯一的ID。每行不匹配的文件(约250个文件,总共约700000行)中应有一个id,该id与其中一个主文件中的单个id相匹配。在每个不匹配的文件中,所有id都应与单个主文件匹配。此外,不匹配的主机中的所有ID都应位于单个主机中

不幸的是,这些列并不总是一致的,id字段可能出现在第[2]行或第[155]行中。(为此我使用python)我最初使用set.intersection并查找长度大于5的匹配实例(缺少标记为“.”的值,或者我希望避免的空白值),但很快就知道运行时太长了。一般来说,我需要将“unmatched”文件与其“master”文件进行匹配,并且我希望使用id从“unmatched”文件中获取列索引。因此,如果未匹配的文件unmatched_a的ID大部分属于master_d,并且unmatched_a中的匹配列是第35列,那么它将返回一行:

无与伦比的a,大师d,35岁


道歉,如果这是不清楚的-我很乐意尝试和澄清,如果需要的话。stackoverflow上的第一个帖子。我可以发布到目前为止我已经发布的代码,但我不认为它会有用,因为问题在于我比较多个(相对)大型csv文件的方法。我看到很多帖子比较了两个csv文件或索引id已知的文件,但没有多个文件和多个可能匹配的文件。

你必须从将所有主文件读入内存开始——这是不可避免的,因为匹配id可能在主文件中的任何位置

然后,对于每个不匹配的文件,您可以读取第一条记录并找到其id(为您提供id列),然后找到包含该id的主文件(为您提供匹配的主文件)。根据您的描述,一旦您匹配了第一条记录,所有剩余的ID都将在同一个文件中,所以您就完成了

将ID读入一个集合——检查成员身份是否为O(1)。将每个集合放入一个与主文件名相匹配的dict中。迭代大师的名言是O(n)。这是O(nm),表示主文件的数量和不匹配文件的数量

import csv

def read_master_file(master_file):
    with open(master_file, "r") as file:
        reader = csv.reader(file)
        ids = set(line[0] for line in file) # I assumed the id is the first value in each row in the master files. Depending on the file format you will want to change this.
    return ids

def load_master_files(file_list):
    return {file: read_master_file(file) for file in file_list}

def check_unmatched_file(unmatched_file, master_dict):
    with open(unmatched_file, "r") as file:
        reader = csv.reader(file)
        record = next(reader)
    for id_column in [2, 155]: # if you can identify an id by semantics, rather than by attempting to match it against the masters, you can reduce running time by 25% by finding the id before this step
        id = record[id_column]
        for master in master_dict:
            if id in master_dict[master]:
                return unmatched_file, master, id
    return None # id not in any master. Feel free to return or raise whatever works best for you

您对每个不匹配的文件具体做了什么?您可以等到处理完该文件后才知道它是用于哪个主文件的吗?每个文件是否只包含一个ID为的列?@cmd-等待结束就可以了。我处理它的方式是一行一行的,但这导致了50000*700000次迭代。我看了每一行,创建了一个集合,取出值,你的问题是什么?“如何加速你的工作?”martineau是的,但我认为这也是我如何处理数据的一个概念问题。我在逐行比较。虽然找到正确的答案肯定会有很大的帮助,但我也在尝试思考“正确”的做事方式(我对编程比较陌生)。我考虑过的另一件事是从不匹配的行中随机抽取100行,与主行进行比较。