删除重复的行

时间:2013-07-03 15:07:33

标签: python csv

[类似帖子] [1]

我有一个制表符分隔的电子表格,我正试图找出一种删除重复条目的方法。以下是一些与电子表格中的数据形式相同的虚构数据:

name    phone   email   website 
Diane Grant Albrecht M.S.           
"Lannister G. Cersei M.A.T., CEP"   111-222-3333    cersei@got.com  www.got.com
Argle D. Bargle Ed.M.           
Sam D. Man Ed.M.    000-000-1111    dman123@gmail.com   www.daManWithThePlan.com
Sam D. Man Ed.M.    
Sam D. Man Ed.M.    111-222-333     dman123@gmail.com   www.daManWithThePlan.com
D G Bamf M.S.           
Amy Tramy Lamy Ph.D.    

我想将Sam D. Man的重复行合并为一个保留两个电话号码的行,但不存储两个相同的电子邮件和两个相同的网站。

我想这样做的方法是存储前一行并比较名称。如果名称匹配,则比较电话号码。如果电话号码不匹配,请附加到第一行。然后比较电子邮件。如果电子邮件不匹配,请附加到第一行。然后比较网站。如果网站不匹配,则将第二个网站添加到第一个网站。然后删除第二行。

  1. 我不知道如何删除一行。其他帖子似乎通过将行写入新文件来避免实际删除行。但我认为这对我的情况有问题,因为我不想两次写相同名称的行。
  2. 是否有更有效的循环方式?嵌套for循环 需要一段时间。
    1. 我可以看到自己遇到超出限制索引的问题......
  3. 这是我的代码:

    with(open('ieca_first_col_fake_text.txt', 'rU')) as f:
        sheet = csv.DictReader(f, delimiter = '\t')
    
    # This function takes a tab-delim csv and merges the ones with the same name but different phone / email / websites.
    def merge_duplicates(sheet):
    
        # Since duplicates immediately follow, store adjacent and compare. If the same name, append phone number 
        for row in sheet:
            for other_row in sheet:
                if row['name'] == other_row['name']:
                    if row['email'] != other_row['email']:
                        row['email'].append(other_row['email'])
                    if row['website'] != other_row['website']:
                        row['website'].append(other_row['website'])
    
        # code to remove duplicate row
        # delete.() or something...
    
    merge_duplicates(sheet)
    

1 个答案:

答案 0 :(得分:1)

在这种情况下,根据“工作表”的大小,将csv.DictReader对象转换为列表可能很有用,这样您就可以对其进行切片并比较各种字段。当你说出以下内容时,我认为你的逻辑也是正确的:

  

我想这样做的方法是存储前一行并比较名称。 1)如果名称匹配,则2)比较电话号码。如果电话号码不匹配,则3)附加到第一行。 4)然后比较电子邮件。 5)如果电子邮件不匹配,请附加到第一行。 6)然后比较网站。 7)如果网站不匹配,则将第二个网站添加到第一个网站。然后删除第二行。 (没必要,只是跳过它)

这是我的(工作前快速撰写)推荐:

with(open('ieca_first_col_fake_text.txt', 'rU')) as f:
    sheet = csv.DictReader(f, delimiter = '\t')

def merge_duplicates(sheet):
    mysheet = list(sheet)

    for rowvalue, row in enumerate(mysheet):
        try:
            for other_row in mysheet[rowvalue+1:]              

                if row['name'] == other_row['name']: # check if it's a duplicate name
                   other_row['delete'] = "duplicate row" #add delete key for later sorting
                   if row['email'] != other_row['email']:
                       row['alt_email'] = other_row['email'] # add new "alt_email" key to original row
                   # test other fields here...
        except IndexError:
            print("We're at the end now") 

之后,您需要迭代并忽略每一行中的“删除”键,并且只保留那些没有的行。