我试图寻找解决方案,但没有任何东西能满足我的需求。我不确定正则表达式能否满足我的需要。
我需要处理提供许可证信息的大量数据。我只需要获取许可证的数量和每个许可证的名称,然后对每个公司的许可证计数进行分组和统计即可。
以下是提取的数据的示例:
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个站) )
最简单的方法是什么?
答案 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)