我有以下格式的数据:
<abc> <anything2> <anything3>.
<_901> <first> <something1>.
<_905> <second> <something2>.
<_910> <anything> <something3>.
<_901> <second> <something4>.
<_905> <first> <something6>.
<_901> <third> <something5>.
<_905> <third> <something7>.
现在我想将与第一列和第二列的(第一、第二、第三)值相对应的所有信息分组在一起,以便获得以下形式的聚合信息:
<abc> <anything2> <anything3>.
<_901> <something1> <something4> <something5>.
<_905> <something6> <something2> <something7>.
<_910> <anything> <something3>.
我尝试使用 python 字典来实现这一点。但因为我有一个 2 Tera 字节的文件。我的程序内存不足并且效率非常低。 python 有没有更快的方法来实现这一点。如果是的话,有人可以举例说明吗?
最佳答案
首先,您可以尝试使用unix工具sort
对数据进行排序(它可以很好地处理非常大的文件)。然后,具有相同第一个和第二个字段的行将位于连续 block 中,以便您可以使用 python 脚本迭代它们并以您喜欢的格式输出。下面给出了一个示例,说明您不希望任何第二列中没有第一、第二或第三的数据。
# merger.py
# this python script takes in a file with sorted lines and gives your output
import sys
prevtag = None
data = ['', '', '']
printed = True
for line in sys.stdin:
fields = line.strip().split()
if fields[0] != prevtag:
if not printed:
print prevtag, ' '.join(data)
printed = True
prevtag = fields[0]
data = ['', '', '']
if fields[1] == '<first>':
data[0] = fields[2]
printed = False
if fields[1] == '<second>':
data[1] = fields[2]
printed = False
if fields[1] == '<third>':
data[2] = fields[2]
printed = False
if not printed:
print prevtag, ' '.join(data)
现在您可以将 sort
的输出通过管道传输到此脚本中以实现您想要的效果。
sort <inputfile> | python merger.py
输入:
<abc> <anything2> <anything3>
<_901> <first> <something1>
<_905> <second> <something2>
<_910> <anything> <something3>
<_901> <second> <something4>
<_905> <first> <something6>
<_901> <third> <something5>
<_905> <third> <something7>
输出:
<_901> <something1> <something4> <something5>
<_905> <something6> <something2> <something7>
关于python 如何有效地将术语组合在一起,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19307691/