首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >从开放文本中提取具有关联数据的数值的工作方法是什么?

从开放文本中提取具有关联数据的数值的工作方法是什么?
EN

Stack Overflow用户
提问于 2019-05-29 07:13:07
回答 3查看 69关注 0票数 0

我试图寻找一个解决方案,但没有什么能完全满足我的需要。我不确定正则表达式是否能满足我的需求。

我需要在提供许可信息的地方处理大量数据。我只需要获取许可证的数量和每个许可证的名称,然后分组并计算每个公司的许可证数量。

下面是拉取的数据示例:

代码语言:javascript
复制
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个工作站)

实现这一点的最简单方法是什么?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2019-05-29 07:33:10

看起来你想忽略车牌号,获取车牌数量和车名。因此,如果数据看起来像看起来一样统一,那么以下内容应该会为您指明方向:

代码语言:javascript
复制
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个或更多空格,并注意它后面的大写字母、小写字母和空格。”(完成后可能需要修剪换行符。)

文件处理位将如下所示:

代码语言:javascript
复制
f = open('/path/to/your_data_file.txt')
for line in f.readlines():
    # run regex and do stuff for each line
    pass
票数 1
EN

Stack Overflow用户

发布于 2019-05-29 07:59:38

代码语言:javascript
复制
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()
票数 1
EN

Stack Overflow用户

发布于 2019-05-29 10:03:37

对于这样的工作,Pandas是一个很好的工具。你可能需要稍微玩玩一下。您还需要将excel文件导出为.csv文件。在解释器中,尝试:

代码语言:javascript
复制
import pandas
raw = pandas.read_csv('myfile.csv')
print(raw.columns)

这将为您提供csv文件的列标题。如果您有标题name和nums,则可以将它们提取为元组列表,如下所示:

代码语言:javascript
复制
extract = list(zip(raw.name, raw.nums))

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

代码语言:javascript
复制
extract = sorted(extract)

Pandas可能有一个很容易压缩的方法,但我想不起来是这样的:

代码语言:javascript
复制
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)

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

代码语言:javascript
复制
with open("myjob.txt", "w+") as fout:
      for x in done:
          line = f"name: {x[0]}    count: {x[1]} \n"
          fout.write(line)
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56351153

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档