0

由于在同一个单元格中连接(该部分不受我控制),我有一个包含许多重复单词的 csv 文件。这通常发生在同一列中。这是一个像我一样的例子:

Name,Geo Location,Default
DRE EXT EXT Pair Video,,
DRE United Kingdom EXT LON Extrane lo.EXT LON RD01,United Kingdom,
DRE United Kingdom EXT LON Extrane lo.EXT LON RD02,United Kingdom,
DRE United Kingdom LON lab dyna test LON,United Kingdom,
DRE United StatesCPT Corp Point Link_Pair Video DRE,United States,
DRE United Kingdom SDD SASD-D TRAIL01 to RD01,United Kingdom,
DRE United Kingdom SDD SASD-D TRAIL01 to RD02 SASD-D,United Kingdom,
DRE United Kingdom SDD SASD-D TRAIL02 to RD01,United Kingdom,
DRE United Kingdom SDD SASD-D TRAIL02 to RD02,United Kingdom,
DRE United Kingdom SDD SASD-D TRAIL01 to TRAIL02,United Kingdom,
DRE United Kingdom SDD SASD-D RD01 to RD02,United Kingdom,
DRE United States MDR SASD-D XC SASD-D Xplay to SASD-D,United States,
DRE Hong Kong (China) Hongkong  HKOuter RD01 HKInter,"Hong Kong, Hong Kong",
DRE United Kingdom DRE LON Sq lab dynam test,United Kingdom,
DRE United States USTHA SPS Thalberg usthamd mdf01,United States,
DRE Hong Kong (China)DRE SASD-D Hong Kong Citi SASD-D EXT,Hong Kong,
SASD-D United States SASD-D USPHXCAP VRF SASD-D USPHXCAP RD02,United States,

我需要删除重复的单词,但只能在同一个单元格中。

我从下面的代码开始,它基于这里关于类似主题的许多其他问题/答案。我的代码不工作,我不知道该怎么做才能让它工作,或者是否有另一种更好的方法。

from csv import DictReader, DictWriter

with open('file1.csv') as fi1,\
     open('file2.csv', 'wb') as fout1:

    read1 = DictReader(fi1)

    write1 = DictWriter(fout1, fieldnames=read1.fieldnames)
    write1.writeheader()



    for line1 in read1:
        col=line1['Name']
        outline = dict(line1)
        ' '.join(set(col.split()))
        write1.writerow(outline)

我需要帮助来完成这项工作或使用其他方法来使其工作。我在想如果有一种方法可以清除行之间的集合,它可能会起作用。

谢谢, B0T

4

2 回答 2

1

这个问题:

' '.join(set(col.split()))

......是你在计算结果,但没有对它任何事情。如果你想line1['Name']用结果替换,你必须这样做:

outline1['Name'] = ' '.join(set(col.split()))

同时,set以任意顺序返回值。所以,一旦你解决了这个问题,你最终会随机打乱单词。更糟糕的是,它可能在您的系统上使用小型设备按预期工作,但在使用更大的设备或在另一台机器上时会失败......</p>

您可以使用从文档OrderedSet链接的配方。collections

但是,还有另一种看起来更简洁的替代方法:recipesunique_everseen中的函数。itertools


当我们这样做时,我不明白您为什么要这样做outline = dict(line1),何时line1已经是一个字典,并且您不需要两个单独的副本(通常,您需要这样才能修改一个而不会影响其他副本,但这不是问题)。

所以:

for line1 in read1:
    line1['Name'] = ' '.join(unique_everseen(line1['Name'].split()))
    write1.writerow(line1)

最后:

我在想如果有一种方法可以清除行之间的集合,它可能会起作用。

您已经为每一行创建了一个新集合,因此无需清除任何内容。

于 2013-07-12T00:09:21.260 回答
0

It kind of looks like you want to remove duplicates that consist of capital letters that may also contains numbers or hyphens, so maybe something like:

s = 'SASD-D United States SASD-D USPHXCAP VRF SASD-D USPHXCAP RD02'

import re
print re.sub(r'(\b[-A-Z0-9]{2,}\b)', lambda L, seen=set(): '' if L.group(1) in seen or seen.add(L.group(1)) else L.group(1), s)
# SASD-D United States  USPHXCAP VRF   RD02
于 2013-07-12T00:10:20.820 回答