我试图寻找一个解决方案,但没有什么能完全满足我的需要。我不确定正则表达式是否能满足我的需求。
我需要在提供许可信息的地方处理大量数据。我只需要获取许可证的数量和每个许可证的名称,然后分组并计算每个公司的许可证数量。
下面是拉取的数据示例:
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个工作站)
实现这一点的最简单方法是什么?
发布于 2019-05-29 07:33:10
看起来你想忽略车牌号,获取车牌数量和车名。因此,如果数据看起来像看起来一样统一,那么以下内容应该会为您指明方向:
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
发布于 2019-05-29 07:59:38
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()
发布于 2019-05-29 10:03:37
对于这样的工作,Pandas是一个很好的工具。你可能需要稍微玩玩一下。您还需要将excel文件导出为.csv文件。在解释器中,尝试:
import pandas
raw = pandas.read_csv('myfile.csv')
print(raw.columns)
这将为您提供csv文件的列标题。如果您有标题name和nums,则可以将它们提取为元组列表,如下所示:
extract = list(zip(raw.name, raw.nums))
然后,您可以按名称对此列表进行排序:
extract = sorted(extract)
Pandas可能有一个很容易压缩的方法,但我想不起来是这样的:
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+)
with open("myjob.txt", "w+") as fout:
for x in done:
line = f"name: {x[0]} count: {x[1]} \n"
fout.write(line)
https://stackoverflow.com/questions/56351153
复制相似问题