大规模 csv 文件的匹配与索引识别

本文描述了如何使用Python处理大量CSV文件,快速匹配待匹配文件的ID与其主文件中的ID,通过创建存储字典并解析文件来寻找匹配,以满足高效匹配的需求,尤其是当待匹配文件可能与多个主文件匹配的情况。
摘要由CSDN通过智能技术生成
  • 拥有两个文件夹,其中分别包含“主文件”和“待匹配文件”。
    - 主文件约有 25 个,总计约 50,000 行,每一行都有一个唯一的 ID。
    - 待匹配文件约有 250 个,总计约 700,000 行,每一行也应该有一个 ID,该 ID 应与主文件中的某一个 ID 相匹配。
    - 在这里插入图片描述

     - 在每个待匹配文件中,所有 ID 都应与同一个主文件匹配。
     - 所有待匹配文件的 ID 都应落在同一个主文件中。
     - 不幸的是,列并不总是保持一致,ID 字段可能出现在第 2 行或第 155 行。
    
     - 最初尝试使用 set.intersection,但运行速度太慢。
     - 需要匹配“待匹配文件”与其“主文件”,并希望获取“待匹配文件”中的列索引以及所使用的 ID。
     - 例如,如果待匹配文件 unmatched_a 的 ID 主要位于主文件 master_d 中,并且 unmatched_a 中的匹配列是第 35 列,则应该返回一行:
     
       ```
       unmatched_a, master_d, 35
       ```
    
    • 问题挑战:

      • 需要匹配多个(相对较大的) csv 文件,每个待匹配文件可能与多个主文件匹配。
      • 匹配过程需要高效,不能花费过长时间。
  1. 解决方案

    • 思路分析:

      • 首先按照主文件存储结构创建存储字典,识别其ID并存储在字典中。
      • 之后解析未匹配文件,寻找其匹配的主文件,再根据主文件寻找匹配ID,当匹配ID找到时存储以字典的形式存储未匹配文件ID与主文件对应ID的匹配索引。
      • 最后存储主文件与未匹配文件的对应关系。
    • 代码示例:

    import csv
    import collections
    
    # 创建主文件存储字典
    master_dict = collections.defaultdict(list)
    for master_file in master_files:
    http://www.jshk.com.cn/mb/reg.asp?kefu=xiaoding;//爬虫IP免费获取;
        with open(master_file, 'r') as f:
            reader = csv.reader(f)
            for row in reader:
                id = row[2]  # 假设 ID 位于第 3 列
                master_dict[id].append(master_file)
    
    # 解析未匹配文件
    for unmatched_file in unmatched_files:
        with open(unmatched_file, 'r') as f:
            reader = csv.reader(f)
            for row in reader:
                id = row[155]  # 假设 ID 位于第 156 列
                # 寻找匹配的主文件
                matching_master_files = master_dict[id]
                if len(matching_master_files) == 1:
                    # 找到匹配的主文件
                    matching_master_file = matching_master_files[0]
                    # 存储未匹配文件 ID 与主文件对应 ID 的匹配索引
                    match_index = row.index(id)
                    unmatched_master_dict[unmatched_file] = {
                        matching_master_file: match_index
                    }
    
    # 存储主文件与未匹配文件的对应关系
    for unmatched_file, master_dict in unmatched_master_dict.items():
        for master_file, match_index in master_dict.items():
            print(unmatched_file, master_file, match_index)
    
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值