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 次通过——一次用于阅读,然后一次用于写作。

文本图 = {}

定义插入(文本,ts):
    全局文本图
    如果文本图中的文本:
        文本映射[文本] = min(ts, 文本映射[文本])
    别的:
        文本地图[文本] = ts

对于 db.hello.find(fields=['text', 'timestamp']) 中的 r:
    插入(r['文本'],r ['时间戳'])

对于文本图中的文本:
   print >>fp, text, textmap[text] # 使用所需的任何格式。

最后,您还可以轻松地将字典转换为元组列表,例如,如果您想在打印之前使用时间戳对结果进行排序。
(请参阅按值对 Python 字典进行排序

于 2013-01-10T19:32:45.467 回答