Я пытался найти решение, но ничто не давало мне того, что мне было нужно. Я не уверен, что регулярное выражение может делать то, что мне нужно.
Мне нужно обработать большой объем данных, где предоставляется информация о лицензии. Мне просто нужно получить количество лицензий и название для каждой лицензии, затем сгруппировать и подсчитать количество лицензий для каждой компании.
Вот пример извлеченных данных:
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 станций)
Каким будет самый простой способ реализовать это?
Я заглянул в Regex, но, похоже, он не способен вытащить имена лицензий с числовыми значениями. Я использовал формулу Excel, но это все еще утомительная работа, я надеюсь, что есть простой способ сделать это с помощью Python. Я немного знаю AutoPy, но этого недостаточно, чтобы делать то, что мне нужно.
Итак, какие регулярные выражения вы пробовали? Я тоже не специалист по регулярным выражениям, но что-то вроде [A-Z0-9]{10}-[A-Z0-9]{10}
, кажется, работает для предоставленных вами образцов данных.
Прошу прощения, не могли бы вы дать мне полный пример кода, с которым я могу поиграть и разобраться? Я не против разбираться в вещах и учиться, но регулярное выражение кажется немного сложным для простого перехода без примера для работы.
Конечно, вы можете использовать regex101.com, чтобы поэкспериментировать с ним :)
Можете ли вы показать желаемый формат вывода для данных данных?
Желаемый формат должен быть примерно таким: 60 MaxCommunicator Session 1 MaxMobile 99 Softswitch Station 12 SIP Trunking Session License 7 Polycom ADV SEAT LIC 12 G.711/G.723/G.729 VoIP Channels 7 Стороннее SIP-устройство Seat 1 Softswitch Combo Base
Мне просто нужно общее количество лицензий для определенного типа лицензии и имя лицензии рядом с ним. Ничего фантастического. Количество лицензий всегда будет разным, но существует только 20 или около того разных имен для лицензий.
Похоже, вы пытаетесь игнорировать номер лицензии и получить количество и имя. Итак, следующее должно указать вам путь к вашим данным, если они так однородны, как кажется:
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
Спасибо, я думаю, что это близко. Как мне импортировать текстовый файл, который нужно искать, используя этот код?
Это линия f = open('your_data_file.txt')
. И f.readlines()
будет давать вам по одной строке за раз.
Итак, у меня есть файл python в той же папке, что и файл excel, и код такой: 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() pass Когда я запускаю программу, она просто мгновенно закрывается и ничего не делает
Строка m.groups()
должна была показать вам результат поиска в случае его успеха. Это зависит от вас, как от программиста, сказать: «О, вот что я получаю от этого. Это те части, которые мне нужны. Я могу пойти отсюда». Строка pass
предназначена только для того, чтобы пример скомпилировался для вас. Это комментарий «запускайте регулярное выражение и делайте что-то для каждой строки», который призван побудить вас добавить туда свою собственную логику. Вам нужно будет получить части, отслеживать итоги (СОВЕТ: defaultdict(int)) и так далее.
Кроме того, я не уверен, что вы сказали «файл excel» в своем первоначальном сообщении. Я предполагал строки в текстовом файле. Вот так бы я пошел, если бы я был вами. Если он экспортируется как файл .csv, там будут запятые, и вам придется настроить регулярное выражение. В любом случае, это определенно выполнимо. (Боже. Если это файл Excel, вы, вероятно, можете сделать это в Excel!)
Lol Я приблизился к тому, что мне нужно, только с Excel, но это все еще замедляет меня. Мне нужно скопировать информацию для каждого клиента в блокнот и добавить вкладки между каждым номером лицензии и названием лицензии, затем обработать в Excel, а затем скопировать из Excel в текстовый документ. Это работает, но это медленно. Формула, которую я использую в Excel: =СУММЕСЛИ(C1:C396,"Станция",B1:B396)+СУММЕСЛИ(C1:C396,"Станция",B1:B396)
Вы должны иметь возможность экспортировать файл как файл .csv из Excel. Я считаю, что это File -> Export
или File -> Save as...
Спасибо за работу со мной. Я все еще новичок в Python, и мне удобнее всего использовать PyAutoGUI, поэтому в итоге я использовал только PyAutoGUI, functools и коллекции для удовлетворения своих потребностей. Спасибо еще раз.
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()
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)
Теперь вы можете записать это в текстовый файл следующим образом (для fstrings требуется 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)
Привет, добро пожаловать в Stack Overflow! что ты уже испробовал?