2015-01-15 54 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

相关问题