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

ただし、よりクリーンに見える別の代替手段があります:レシピunique_everseenの関数です。itertools


私たちがそれに取り組んでいる間、なぜあなたがoutline = dict(line1), whenline1はすでに dict であり、2 つの別々のコピーを必要としないのか理解できません (通常、他のコピーに影響を与えずに 1 つを変更できるようにする必要があります)。 、しかしそれはここでは問題ではありません)。

そう:

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

ついに:

行間のセットをクリアする方法があればうまくいくかもしれないと思っていました。

すでに行ごとに新しいセットを作成しているため、クリアするものはありません。

于 2013-07-12T00:09:21.260 に答える
0

数字やハイフンを含む可能性のある大文字で構成される重複を削除したいように見えるので、おそらく次のようになります。

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 に答える