2013-07-03 3 views
0

[Похожие сообщения] [1]Удаление повторяющихся строк

У меня есть табуляции таблицы и я пытаюсь выяснить способ для удаления повторяющихся записей. Вот некоторые выдуманные данные, которые имеют ту же форму, что и данные в таблице:

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

Я хотел бы иметь повторяющиеся строки для Sam D. Человек слившихся в один, который удерживает два телефонных номера, но Безразлично» t хранят два одинаковых адреса электронной почты и два одинаковых веб-сайта.

Способ, которым я думал об этом, состоял в том, чтобы сохранить предыдущую строку и сравнить имена. Если имена совпадают, сравните номера телефонов. Если номера телефонов не совпадают, добавьте их в первую строку. Затем сравните электронные письма. Если письма не совпадают, добавьте в первую строку. А затем сравните сайты. Если веб-сайты не совпадают, добавьте второй веб-сайт в первую очередь. Затем удалите вторую строку.

  1. Я не знаю, как удалить строку. Остальные сообщения, похоже, вообще не удаляют строки, записывая строки в новый файл. Но я думаю, что это проблематично для моего случая, потому что я не хочу писать строки с одинаковыми именами дважды.
  2. Есть ли более эффективные средства для петли? Вложенные для петель занимают некоторое время.
    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) 
+0

Я думаю, что вам захочется сохранить результаты вашего слияния где-нибудь (либо в другом файле, либо временно в памяти, в зависимости от того, сколько данных вы работаете), в противном случае вы будете удалять строки из файла, который вы «повторение», которое обычно считается «нет-нет». – erewok

+0

Хорошо, так что доходит до того, о чем я говорил. Что происходит, когда я повторяю примерную таблицу и добираюсь до второго экземпляра Сэм Д. Ман? – goldisfine

+0

Рассматривали ли вы использование «Панд». В вашей проблеме много решений. – LonelySoul

ответ

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

После этого, вам нужно перебрать и игнорировать каждую строку с «удалить» ключ к нему и сохранить только тех, у кого нет.

Смежные вопросы