我正在寻找一种算法来在 Python 中根据它们的列名来比较两个 excel 表。
我不知道这些列是什么,所以一张表可能有一个额外的列,或者两张表都可以有几个同名的列。
最简单的情况是第一个工作表中的一列仅对应第二个 Excel 工作表中的一列。然后我可以使用xlrd
. 如果列名不是唯一的,我可以验证列是否具有相同的位置。
有谁知道已经存在的算法或在这个领域有任何经验?
快速肮脏:
# Since order of the names doesn't matter, we can use the set() option
matching_names = set(sheet_one_names) & set(sheet_one_names)
...
# Here, order does matter since we're comparing rowdata..
# not just if they match at some point.
matching_rowdata = [i for i, j in zip(columndata_one, columndata_two) if i != j]
注意:这假设你已经做了一些事情,
xlrd
并与第二张表相同,这是给你一个想法。
另请注意,执行 [...] 选项(第二个)很重要,行的长度相同,否则将被跳过。这是一个MISS-MATCH场景,反向获取数据流中的匹配项。
这是一个较慢但功能强大的解决方案:
column_a_name = ['Location', 'Building', 'Location']
column_a_data = [['Floor 1', 'Main', 'Sweden'],
['Floor 2', 'Main', 'Sweden'],
['Floor 3', 'Main', 'Sweden']]
column_b_name = ['Location', 'Building']
column_b_data = [['Sweden', 'Main', 'Floor 1'],
['Norway', 'Main', 'Floor 2'],
['Sweden', 'Main', 'Floor 3']]
matching_names = []
for pos in range(0, len(column_a_name)):
try:
if column_a_name[pos] == column_b_name[pos]:
matching_names.append((column_a_name[pos], pos))
except:
pass # Index out of range, column length are not the same
mismatching_data = []
for row in range(0, len(column_a_data)):
rowa = column_a_data[row]
rowb = column_b_data[row]
for name, _id in matching_names:
if rowa[_id] != rowb[_id] and (rowa[_id] not in rowb or rowb[_id] not in rowa):
mismatching_data.append((row, rowa[_id], rowb[_id]))
print mismatching_data