如何根据前两个匹配列从多个大型文本文件的第三列中提取数据



我有 3 个大文本文件(每个>16 M 行(,格式如下。

文件 1 的内容:

22_0F3, 33_0F4, 0.87
28_0F3, 37_0F4, 0.79
21_0F5, 39_2F1, 0.86

文件 2 的内容:

22_0F3, 33_0F4, 1000
28_0F3, 37_0F4, 1500
21_0F2, 52_2F8, 3600

文件 3 的内容:

22_0F3, 33_0F4, 0.75
28_0F3, 37_0F4, 0.91
81_0F2, 32_2F1, 0.84

我正在尝试根据这 3 个文件中的第一个两个字段提取公共行。

然后,我必须从每行的第 3 列中找到每个相应值的平方的平方根(如下所述(。

困难在于,由于这些文本文件非常庞大,超过 1600 万行,因此加载和提取公共行需要更多时间。

根据我拥有的数据,公共线路约为 15M。

中间输出是这样的:

22_0F3, 33_0F4, 0.87, 1000, 0.75
28_0F3, 37_0F4, 0.79, 1500, 0.91

所需的输出为:

22_0F3, 33_0F4, 1000.7575
28_0F3, 37_0F4, 1500.6245

其中1000.75750.8710000.75的平方和的平方根。

如何毫不拖延地从这些大文件中获得所需的输出?

您可以扫描 3 个文件并在内存中构建一个字典,代码对作为键,数字列表作为值。 对于大多数现代 PC 来说,包含 1600 万个小项目的字典应该没有问题。 然后浏览字典,对列表中具有 3 个值的项目进行计算,并将它们写入输出文件。

# Aggregation (build dictionary of lists) ...
from collections import defaultdict
data = defaultdict(list)
for fileName in ["file1.txt","file2.txt","file3.txt"]:
    with open(fileName,'r') as lines:
        for line in lines:
            col1,col2,value = line.split(",") 
            if col1>col2 : col1,col2 = col2,col1 # match codes in any order
            data[(col1,col2)].append(float(value))
# Calculation and output...
from math import sqrt
with open("output.txt","w") as output:
    for (col1,col2),values in data.items():
        if len(values) < 3: continue             # must have the 3 matches
        result = sqrt(sum( x*x for x in values)) # use your formula here                       
        output.write(f"{col1},{col2}, {result}n")

对于我的笔记本电脑上的 15,000,000 行匹配行,这需要 68 秒。 (但我有SSD,硬盘驱动器可能需要更长的时间(

请注意,我在计算中使用了平方和的平方根。 根据您的示例,这显然不是正确的公式,因为 √(0.87^2 + 1000^2 + 0.75^2)是 1000.0006597 而不是 1000.7575。 我假设您将用您自己的结果计算替换我的 √∑n^2 公式。

最新更新