Как правильно сравнить строки и столбцы в двух разных больших файлах Excel в python? - PullRequest
0 голосов
/ 02 июня 2019

Добрый день. Существует несколько файлов Excel большого размера (более 280 000 строк). В каждом из них есть столбец с уникальными идентификаторами и столбец со значением, соответствующим каждому идентификатору. Для идентификатора первого файла необходимо сравнить значение, соответствующее идентификатору, со значением во втором файле, если они не равны, то со значением в третьем файле и т. Д. С пятым файлом. Если не найдено равных значений, необходимо записать идентификатор и его значение в новый файл Excel. Пример:

(first excel file)  (second excel file)
ID  Value              ID    Value
1    100               2      200
2    200               3      888
3    300               1      100

Программе необходимо сравнить значение для каждого идентификатора и записать несовпадающий идентификатор и его значение в третий файл (в данном случае 3 и 888 или 3 и 300)

Я написал программу на python, используя openpyxl, но когда я пытаюсь записать набор значений в словарь, программа зависает, и память компьютера заканчивается.

import openpyxl
import os
os.getcwd()

def xls_to_dict(filename, max_row):
    print('Opening file' + filename)
    wb = openpyxl.load_workbook(filename)
    sheet = wb.get_sheet_by_name('Sheet1')
    data_dict = {}
    for row in range(2, max_row + 1):
        data_dict[sheet['B' + str(row)].value] = sheet['X' + str(row)].value
    return data_dict

def dict_to_xls(data_dict):
    wb = workbook()
    sheet = wb.active
    for next_row in range(1, len(data_dict) + 1):
        policy_id, current = data_dict.popitem()
        sheet.cell(column = 1, row = next_row, value = policy_id)
        sheet.cell(column = 2, row = next_row, value = current)
    return wb

insis_dict = xls_to_dict('ALF_T_REP_PROFIT.xlsx', 253840)
qlik_20_dict = xls_to_dict('Qlik - 20.05.2019', 230725)
qlik_21_dict = xls_to_dict('Qlik - 21.05.2019', 230725)
qlik_22_dict = xls_to_dict('Qlik - 22.05.2019', 230725)
qlik_23_dict = xls_to_dict('Qlik - 23.05.2019', 230725)

empty_polices = {}
diff_polices = {}
for key in insis_dict:
    if key not in qlik_20_dict:
        diff_polices[key] = insis_data[key]
        continue
    if insis_dict[key] == qlik_20_dict[key]:
        continue
    elif insis_dict[key] == qlik_21_dict[key]:
        continue
    elif insis_dict[key] == qlik_22_dict[key]:
        continue
    elif insis_dict[key] == qlik_23_dict[key]:
        continue
    else:
        empty_polices[key] = insis_data[key]

dict_to_xls(empty_polices).save('empty_polices.xlsx')
dict_to_xls(diff_polices).save('diff_polices.xlsx')

Есть ли другой способ сравнить значения каждого идентификатора в разных файлах Excel и записать расхождения в новом файле Excel? Может быть, кто-то знает, как это сделать с помощью встроенных инструментов Excel?

1 Ответ

0 голосов
/ 02 июня 2019

Настройка: CSV файлы вместо файлов Excel.

import io, csv
s = '''ID,Value
1,100
2,200
3,300
4,400''' 
base = io.StringIO(s)

s = '''ID,Value
2,200
3,888
1,100
4,222'''
f2 = io.StringIO(s)

s = '''ID,Value
4,333
2,200
3,888
1,100'''
f3 = io.StringIO(s)

Прочитайте базовый файл и создайте словарь

d = {}
reader = csv.reader(base)
next(reader)
for k,v in reader:
    d[k] = v

Прочитайтедругие файлы;если найдено совпадение , поместите Id в набор

found = set()

for f in [f2,f3]:
    reader = csv.reader(f)
    next(reader)
    for k,v in reader:
        if d[k] == v:
            found.add(k)

Используя Id, которые НЕ были найдены, создайте новый файл, используя Valueиз базового словаря.

missing = io.StringIO()
writer = csv.writer(missing)
writer.writerow(['Id','Value'])
for key in found.symmetric_difference(d):
    writer.writerow([key,d[key]])

Это может быть лучше.Прочитайте базовый файл и поместите наборы (ID,value) в набор.Прочитать другие файлы;если найдено совпадение , удалите этот кортеж из набора.Запишите все оставшиеся кортежи в наборе в новый файл.

reader = csv.reader(base)
next(reader)
base_values = set() 
for ID,value in reader:
    base_values.add((ID,value))

for f in [f2,f3]:
    reader = csv.reader(f)
    next(reader)
    for row in reader:
        thing = tuple(row)
        if thing in base_values:
            base_values.remove(thing)

missing2 = io.StringIO()
writer = csv.writer(missing2)
writer.writerow(['Id','Value'])
writer.writerows(base_values)
...