2

2 つの列に基づいて csv ファイルから重複行を削除するにはどうすればよいですか。これらの列の 1 つは正規表現を使用して一致を判断し、最初のフィールド (IPAddress) でグループ化します。最後に、カウント フィールドを行に追加して、重複行をカウントします。

csv ファイル:

IPAddress, Value1, Value2, Value3
127.0.0.1, Test1ABC, 10, 20
127.0.0.1, Test2ABC, 20, 30
127.0.0.1, Test1ABA, 30, 40
127.0.0.1, Value1BBA, 40, 50
127.0.0.1, Value1BBA, 40, 50
127.0.0.2, Test1ABC, 10, 20
127.0.0.2, Value1AAB, 20, 30
127.0.0.2, Value2ABA, 30, 40
127.0.0.2, Value1BBA, 40, 50

IPAddress と Value1 で一致させたい (最初の 5 文字が一致する場合、Value1 が一致する)。

これは私に与えるでしょう:

IPAddress, Value1, Value2, Value3, Count
127.0.0.1, Test1ABC, 10, 20, 2
127.0.0.1, Test2ABC, 20, 30, 1
**127.0.0.1, Test1ABA, 30, 40** (Line would be removed but counted)
127.0.0.1, Value1BBA, 40, 50, 2
**127.0.0.1, Value1BBA, 40, 50** (Line would be removed but counted)
127.0.0.2, Test1ABC, 10, 20, 1
127.0.0.2, Value1AAB, 20, 30, 2
127.0.0.2, Value2ABA, 30, 40, 1
**127.0.0.2, Value1BBA, 40, 50** (Line would be removed but counted)

新しい出力:

IPAddress, Value1, Value2, Value3, Count
127.0.0.1, Test1ABC, 10, 20, 2
127.0.0.1, Test2ABC, 20, 30, 1
127.0.0.1, Value1BBA, 40, 50, 2
127.0.0.2, Test1ABC, 10, 20, 1
127.0.0.2, Value1AAB, 20, 30, 2
127.0.0.2, Value2ABA, 30, 40, 1

セットを使用してみましたが、明らかにセットにインデックスを付けることができません。

entries = set()
writer=csv.writer(open('myfilewithoutduplicates.csv', 'w'), delimiter=',')
    for row in list:
    key = (row[0], row[1])
        if re.match(r"(Test1)", key[1]) not in entries:
        entries.add(key)

疑似コード ?:

# I want to iterate through rows of a csv file and
if row[0] and row[1][:5] match a previous entry:
    remove row
    add count
else:
    add row

どんな助けや指導も本当に感謝しています。

4

2 に答える 2

1

一致を追跡するには辞書が必要です。正規表現は必要ありませ。追跡する必要があるのは最初の 5 文字だけです。最初の列と 2 番目の列の最初の 5 文字で構成される「キー」によって行を格納し、カウントを追加します。最初にカウントしてから、収集した行とカウントを書き出す必要があります。

順序が重要な場合は、辞書を次のように置き換えることができますがcollections.OrderedDict()、それ以外のコードは同じです。

rows = {}

with open(inputfilename, 'rb') as inputfile:
    reader = csv.reader(inputfile)
    headers = next(reader)  # collect first row as headers for the output
    for row in reader:
        key = (row[0], row[1][:5])
        if key not in rows:
            rows[key] = row + [0,]
        rows[key][-1] += 1  # count

with open('myfilewithoutduplicates.csv', 'wb') as outputfile:
    writer = csv.writer(outputfile)
    writer.writerow(headers + ['Count'])
    writer.writerows(rows.itervalues())
于 2013-08-08T12:40:09.070 に答える