2015-01-15 85 views
0

我在一個文件夾中有多個CSV文件,我想比較它們並打印匹配的行(列數可能不同)。我知道如何在文件中獲取重複內容,但這種情況有點不同。假設文件夾中有兩個文件,我想對它們進行比較。比較文件夾中的所有CSV文件並打印重複行

CSV1: 
H1,H2,H4 
C01,23,F 
C2,45,M 

CSV2: 
H1,H2,H3,H4 
C01,23,data,F 
C01,23,some other data,M 
C4,34,data,M 

我需要輸出,檢查所有可用的數據(從一個與列數最少),在同一文件夾中的另一個文件完全一致。我的輸出也能像

CSV1,CSV2 (H1:C01,H2:23,H4:F(H3:data)) 

回答

1

什麼是這樣的:

def duplines(csv_least_cols, csv_most_cols): 
    rowset = set() 
    with open(csv_least_cols) as csv1: 
     r = csv.reader(csv1) 
     csv1_cols = next(r) 
     for row in r: 
      rowset.add(tuple(row)) 
    with open(csv_most_cols) as csv2: 
     dr = csv.DictReader(csv2) 
     for drow in dr: 
      refcols = tuple(drow[c] for c in csv1_cols) 
      if refcols in rowset: yield csv1_cols, refcols, drow 

您可以在一個循環中調用這個和執行任何格式化你想要的 - 這種發電機的基本邏輯的交易,分離出格式化任務給它的調用者。

例如要得到你想要的特有風格CSV1,CSV2 (H1:C01,H2:23,H4:F(H3:data))輸出,你可以有...:

def formatit(csv_least, csv_most): 
    out_start = '{},{} ('.format(csv_least, csv_most) 
    for c1cols, refvals, c2dict in duplines(csv_least, csv_most): 
     out_middle = [] 
     for c, v in zip(c1cols, refvals): 
      out_middle.append('{}:{}'.format(c, v)) 
     out_end = [] 
     for c in c2dict: 
      if c in c1cols: continue 
      out_end.append('{}:{}'.format(c, c2dict[c])) 
     out = '{}{}({}))'.format(out_start, ','.join(out_middle), ','.join(out_end)) 
     print(out) 

你會發現格式化的工作基本上是比實際的邏輯比較複雜的(因此更容易隱藏錯誤:-)這就是爲什麼我稱你想要的格式「奇特」。

但我希望這至少可以讓你開始(並且你可以單獨嘗試每個功能,確保邏輯在你擔心格式化之前就像你想要的那樣:-)。

+0

謝謝。我會嘗試這個並更新你。無論如何,格式無關緊要。 – abn

相關問題