2

Mongo から CSV ファイルにデータをインポートしています。インポートは、各 JSON ドキュメントの「タイムスタンプ」と「テキスト」で構成されます。

ドキュメント:

{ 
name: ..., 
size: ..., 
timestamp: ISODate("2013-01-09T21:04:12Z"), 
data: { text:..., place:...},
other: ...
}

コード:

with open(output, 'w') as fp:
   for r in db.hello.find(fields=['text', 'timestamp']):
       print >>fp, '"%s","%s"' % (r['text'], r['timestamp'].strftime('%H:%M:%S'))

重複を削除したいと思います (一部の Mongo ドキュメントには同じテキストがあります)。最初のインスタンス (時間に関して) はそのままにしておきたいです。インポート時にこれらの重複を削除することはできますか?

ご協力いただきありがとうございます!

4

2 に答える 2

3

セットを使用してデータのハッシュを保存し、重複をチェックします。このようなもの:

import md5

hashes = set()
with open(output, 'w') as fp:
   for r in db.hello.find(fields=['text', 'timestamp']):
       digest = md5.new(r['text']).digest()
       if digest in hashes:
            # It's a duplicate!
            continue
       else:
            hashes.add(digest)
       print >>fp, '"%s","%s"' % (r['text'], r['timestamp'].strftime('%H:%M:%S'))

テキスト フィールドを直接使用できることは注目に値しますが、より大きなテキスト フィールドの場合、ハッシュのみを格納する方がメモリ効率がはるかに高くなります。

于 2013-01-10T18:26:04.750 に答える
1

(テキスト、タイムスタンプ) ペアを維持するには、マップ (辞書) を維持する必要があります。「テキスト」がキーなので、重複はありません。読み取りの順序は、最も古いタイムスタンプが最初に返されるとは限りません。その場合、2 つのパスを作成する必要があります。1 回は読み取り用で、もう 1 回は書き込み用です。

テキストマップ = {}

def 挿入 (テキスト、ts):
    グローバル テキストマップ
    テキストマップ内のテキストの場合:
        textmap[テキスト] = min(ts, textmap[テキスト])
    そうしないと:
        textmap[テキスト] = ts

for r in db.hello.find(fields=['text', 'timestamp']):
    insert(r['テキスト'], r['タイムスタンプ'])

テキストマップ内のテキストの場合:
   print >>fp, text, textmap[text] # 任意のフォーマットで。

最後に、たとえば印刷前にタイムスタンプを使用して結果を並べ替えたい場合に備えて、辞書をタプルのリストに簡単に変換することもできます。
( Python 辞書を値で並べ替えるを参照してください)

于 2013-01-10T19:32:45.467 に答える