2013-02-07 2 views
1

파이썬에서 열 이름을 기준으로 두 개의 Excel 시트를 comapre하는 알고리즘을 찾고 있습니다.Excel diff with python

열이 무엇인지 알 수 없으므로 한 시트에 추가 열이 있거나 두 시트 모두 같은 이름의 여러 열을 가질 수 있습니다.

가장 쉬운 경우는 첫 번째 시트의 열이 두 번째 Excel 시트의 한 열에 만 해당하는 경우입니다. 그런 다음 xlrd을 사용하여 해당 열의 행에 diff를 수행 할 수 있습니다. 열 이름이 고유하지 않은 경우 열의 위치가 동일한 지 확인할 수 있습니다.

이미 알고있는 알고리즘을 알고 있거나이 도메인에서 경험이있는 사람이 있습니까?

+0

.. 작업의 이런 종류의 실제 알고리즘은 없습니다하지만 무엇에 따라 달라집니다 결과는 다음과 같아야합니다. 일치하지 않는 열 이름을 무시하거나 공동 목록으로 결합합니까? – Torxed

+0

사실 일치하는 열의 일치하지 않는 셀을 강조 표시하고 일치하지 않는 전체 열을 강조 표시하려고합니다. 두 번째 시트에 누락 된 열 또는 추가 열을 의미합니다. 일치하지 않는 열 이름을 결합 목록에 결합하는 용도는 무엇입니까? – user1711699

+0

그래서, ** 1 : ** 일치하는 열 이름을 표시 ** 2 : **이 두 열 내에서 일치하지 않는 NON 값을 강조 하시겠습니까? – Torxed

답변

0

빠른 더러운 :

# 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] 

참고 :이

  1. xlrd를 통해 시트 1 열 이름을 얻고 두 번째 시트 같은, 당신이 앞으로 몇 일을 한 적이 있다고 가정 ,
  2. 두 개의 서로 다른 변수에서 두 시트의 행 데이터를 가져옵니다.

이것은 당신에게 아이디어를 제공하기위한 것입니다.

[...] 옵션 (두 번째 것)을 수행하면 행의 길이가 동일해야한다는 점에 유의하십시오. 그렇지 않으면 건너 뜁니다. 이것은 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 
+0

감사합니다.하지만 이름이 두 시트에 두 번 나타나면 어떻게됩니까? 일치하는 열을 찾는 기준은 무엇입니까? 두 시트의 열 이름 사이에 일대일 관계가없는 경우를 의미합니까? – user1711699

+0

들려요. 내가 뭔가를 만들거나 내 옛 발췌 문장을 찾으십시오. – Torxed

+0

이것이 원하는대로 작동하는지 확인하십시오. 나는 [(1, '스웨덴', '노르웨이')]'를 미스 매치 (missmatch)로 얻으며, 이것은 당신이 찾고있는 것이어야합니까? 1은 실패한 행이며, 가장 큰 column_a를 계산합니다 (어떤 열이 가장 긴지 등을 확인하여 오류를 방지해야합니다). – Torxed