0

[类似帖子][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. 而且我可以看到自己遇到索引超出限制的问题...

这是我的代码:

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)
4

1 回答 1

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") 

之后,您需要遍历并忽略其中包含“删除”键的每一行,只保留那些没有的行。

于 2013-07-03T16:05:19.113 回答