从公开文本中提取带有关联数据的数值的有效方法是什么?

时间:2019-05-28 23:13:07

标签: python python-3.x

我试图寻找解决方案,但没有任何东西能满足我的需求。我不确定正则表达式能否满足我的需要。

我需要处理提供许可证信息的大量数据。我只需要获取许可证的数量和每个许可证的名称,然后对每个公司的许可证计数进行分组和统计即可。

以下是提取的数据的示例:

L00129A578-E105C1D138   1 Centralized Recording 

$42.00
L00129A677-213DC6D60E   1 Centralized Recording 

$42.00
1005272AE2-C1D6CACEC8   5 Station   

$45.00
100525B658-3AC4D2C93A   5 Station   

$45.00

我需要获取许可证计数和许可证名称,然后添加类似的对象,以便它可以获取(1个集中记录,1个集中记录,5个站,5个站),然后添加许可证计数和输出(2个集中记录,10个站) )

最简单的方法是什么?

3 个答案:

答案 0 :(得分:1)

您似乎正在尝试忽略许可证编号,并获取计数和名称。因此,以下内容将使您在处理数据的过程中(如果看起来一样统一):

import re
r = re.compile(r"\s+(\d+)\s+[A-Za-z ]+")
r = re.compile(r"\s+(\d+)\s+([A-Za-z ]+)")
m = r.search(" 1   Centralized")
m.groups()
# ('1', 'Centralized')

该正则表达式只是说:“要求但忽略1个或多个空格,注意其后的数字串,要求但忽略1个或多个空格,并注意大写字母,小写字母和后面留空格。” (完成后,您可能需要修剪换行符。)

文件处理位如下所示:

f = open('/path/to/your_data_file.txt')
for line in f.readlines():
    # run regex and do stuff for each line
    pass

答案 1 :(得分:1)

import re, io, pandas as pd
a = open('your_data_file.txt')
pd.read_csv(io.StringIO(re.sub(r'(?m).*\s(\d+)\s+(.*\S+)\s+$\n|.*','\\1,\\2',a)),
                header=None).groupby(1).sum()[0].to_dict()

答案 2 :(得分:1)

Pandas是处理此类工作的好工具。您可能需要尝试一下。您还需要将excel文件导出为.csv文件。在解释器中,尝试:

max_vocab_size

这将为您提供csv文件的列标题。如果您有标头名称和数字,则可以将其提取为元组列表,如下所示:

import pandas
raw = pandas.read_csv('myfile.csv')
print(raw.columns)

然后您可以按名称对列表进行排序:

extract = list(zip(raw.name, raw.nums))

Pandas可能有一种轻松压缩它的方法,但我想不起来:

extract = sorted(extract)

现在您可以将其写入文本文件,如下所示(字符串需要Python 3.6 +)

def accum(c):
    nm = c[0][0]
    count = 0
    result = []
    for x in c:
        if x[0] == nm:
            count += x[1]
        else:
            result.append((nm, count))
            nm = x[0]
            count = x[1]
    result.append((nm, count))
    return result

done = accum(extract)