-
拥有两个文件夹,其中分别包含“主文件”和“待匹配文件”。
- 主文件约有 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 文件,每个待匹配文件可能与多个主文件匹配。
- 匹配过程需要高效,不能花费过长时间。
-
-
解决方案
-
思路分析:
- 首先按照主文件存储结构创建存储字典,识别其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)
-