2013-02-07 23 views
1

我正在尋找一種算法來在Python中基於它們的列名稱comapre兩個Excel表。Excel與Python的區別

我不知道列是什麼,所以一張紙可能有一個額外的列或兩張紙可以有幾個同名的列。

最簡單的情況是,第一張表格中的一列與第二張表格中的一列相對應。然後我可以使用xlrd在該列的行上執行差異。 如果列名不唯一,我可以驗證列是否具有相同的位置。

有誰知道現有的算法或有任何經驗,在這個領域?

+0

我在我的天做了不少工作,對Excel表格..有這種類型的任務沒有真正的算法,但它取決於你結果應該看起來像..忽略不匹配的列名或將它們組合成聯合列表? – 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,'瑞典','挪威')]'作爲一個錯配,這應該是你在找什麼?請注意,1是失敗的行,我指望column_a是最大的(這是你必須添加安全失敗,通過檢查哪一列是最長的等等) – Torxed