[类似帖子] [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的重复行合并为一个保留两个电话号码的行,但不存储两个相同的电子邮件和两个相同的网站。
我想这样做的方法是存储前一行并比较名称。如果名称匹配,则比较电话号码。如果电话号码不匹配,请附加到第一行。然后比较电子邮件。如果电子邮件不匹配,请附加到第一行。然后比较网站。如果网站不匹配,则将第二个网站添加到第一个网站。然后删除第二行。
这是我的代码:
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 :(得分: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")
之后,您需要迭代并忽略每一行中的“删除”键,并且只保留那些没有的行。