如何从格式不正确的 txt 文件中绘制图形?

How to plot a graph from a txt file that is not properly formatted?

我需要根据给定文本文件中的数据绘制图表,但文本文件的格式不正确,无法轻松提取数据。有没有什么方法可以自动将我需要的数据提取到适当的列表或数据框中,比如使用 python 的 Jupyter notebook 来轻松绘制图表? 这是文件的方式目前看起来像:

    ###########
    Average Hybridsort CPU time, array size 1: 110
    Average Mergesort CPU time, array size 1: 98
    
    Average Hybridsort comparisons, array size 1: 0
    Average Mergesort comparisons, array size 1: 0
    ###########
    Average Hybridsort CPU time, array size 2: 118
    Average Mergesort CPU tim, array size 2: 156
    
    Average Hybridsort comparisons, array size 2: 0
    Average Mergesort comparisons, array size 2: 1
    ###########
    Average Hybridsort CPU time, array size 3: 133
    Average Mergesort CPU time, array size 3: 175
    
    Average Hybridsort comparisons, array size 3: 1
    Average Mergesort comparison, array size 3: 4
    ###########
    Average Hybridsort CPU time, array size 4: 121
    Average Mergesort CPU time, array size 4: 170
    
    Average Hybridsort comparisons, array size 4: 2
    Average Mergesort comparisons, array size 4: 6
    ########### (and so on...)

所以文件中有清晰的格式和模式,但我不确定如何才能只提取绘制图形所需的值。 所以我试图从中提取数据并绘制两个图:Hybridsort CPU 时间图和 Mergesort CPU 时间与数组大小的关系(因此在一个图中绘制两条线图)和 Hybridsort 比较图和 Mergesort 与数组大小的比较(也是一张图中的两条线图)。我熟悉 jupyter notebook 和 python,并且更愿意将它们绘制在那里,但也欢迎使用其他方法。谢谢!

您需要进行一些搜索和替换,以确保所有预期标签的命名一致(有些是复数形式,有些不是,等等)

然后您可以使用set()提取所有标签。

然后你可以在循环中解析出其他值。我已经将数据放入字典中,如果更容易绘图,您可以采用不同的格式。

txt = """"
###########
Average Hybridsort CPU time, array size 1: 110
Average Mergesort CPU time, array size 1: 98

Average Hybridsort comparisons, array size 1: 0
Average Mergesort comparisons, array size 1: 0
###########
Average Hybridsort CPU time, array size 2: 118
Average Mergesort CPU time, array size 2: 156

Average Hybridsort comparisons, array size 2: 0
Average Mergesort comparisons, array size 2: 1
###########
Average Hybridsort CPU time, array size 3: 133
Average Mergesort CPU time, array size 3: 175

Average Hybridsort comparisons, array size 3: 1
Average Mergesort comparisons, array size 3: 4
###########
Average Hybridsort CPU time, array size 4: 121
Average Mergesort CPU time, array size 4: 170

Average Hybridsort comparisons, array size 4: 2
Average Mergesort comparisons, array size 4: 6
"""

data = {}
labels = set([x.split(",")[0] for x in txt.split("\n") if x.startswith("Average")])
print(labels)
for label in labels:
    for line in txt.split("\n"):
        if line.startswith(label):
            line_split = line.split(':')
            x = int([x for x in line_split[0].split() if x.isdigit()][0])
            y = int(line_split[1])
            if label not in data.keys():
                data[label] = [(x, y)]
            else:
                data[label].append((x, y))
print(data)

输出:

{'Average Hybridsort comparisons', 'Average Mergesort CPU time', 'Average Mergesort comparisons', 'Average Hybridsort CPU time'}
{'Average Hybridsort comparisons': [(1, 0), (2, 0), (3, 1), (4, 2)], 'Average Mergesort CPU time': [(1, 98), (2, 156), (3, 175), (4, 170)], 'Average Mergesort comparisons': [(1, 0), (2, 1), (3, 4), (4, 6)], 'Average Hybridsort CPU time': [(1, 110), (2, 118), (3, 133), (4, 121)]}