Каков рабочий метод извлечения числовых значений со связанными данными из открытого текста?

Я пытался найти решение, но ничто не давало мне того, что мне было нужно. Я не уверен, что регулярное выражение может делать то, что мне нужно.

Мне нужно обработать большой объем данных, где предоставляется информация о лицензии. Мне просто нужно получить количество лицензий и название для каждой лицензии, затем сгруппировать и подсчитать количество лицензий для каждой компании.

Вот пример извлеченных данных:

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 станций)

Каким будет самый простой способ реализовать это?

Привет, добро пожаловать в Stack Overflow! что ты уже испробовал?

grooveplex 29.05.2019 01:15

Я заглянул в Regex, но, похоже, он не способен вытащить имена лицензий с числовыми значениями. Я использовал формулу Excel, но это все еще утомительная работа, я надеюсь, что есть простой способ сделать это с помощью Python. Я немного знаю AutoPy, но этого недостаточно, чтобы делать то, что мне нужно.

Kevin Burris 29.05.2019 01:17

Итак, какие регулярные выражения вы пробовали? Я тоже не специалист по регулярным выражениям, но что-то вроде [A-Z0-9]{10}-[A-Z0-9]{10}, кажется, работает для предоставленных вами образцов данных.

grooveplex 29.05.2019 01:21

Прошу прощения, не могли бы вы дать мне полный пример кода, с которым я могу поиграть и разобраться? Я не против разбираться в вещах и учиться, но регулярное выражение кажется немного сложным для простого перехода без примера для работы.

Kevin Burris 29.05.2019 01:29

Конечно, вы можете использовать regex101.com, чтобы поэкспериментировать с ним :)

grooveplex 29.05.2019 01:30

Можете ли вы показать желаемый формат вывода для данных данных?

Chi 29.05.2019 01:49

Желаемый формат должен быть примерно таким: 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

Kevin Burris 29.05.2019 01:52

Мне просто нужно общее количество лицензий для определенного типа лицензии и имя лицензии рядом с ним. Ничего фантастического. Количество лицензий всегда будет разным, но существует только 20 или около того разных имен для лицензий.

Kevin Burris 29.05.2019 01:53
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
8
70
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Ответ принят как подходящий

Похоже, вы пытаетесь игнорировать номер лицензии и получить количество и имя. Итак, следующее должно указать вам путь к вашим данным, если они так однородны, как кажется:

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

Спасибо, я думаю, что это близко. Как мне импортировать текстовый файл, который нужно искать, используя этот код?

Kevin Burris 29.05.2019 01:40

Это линия f = open('your_data_file.txt'). И f.readlines() будет давать вам по одной строке за раз.

Mike 29.05.2019 01:42

Итак, у меня есть файл 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 Когда я запускаю программу, она просто мгновенно закрывается и ничего не делает

Kevin Burris 29.05.2019 01:43

Строка m.groups() должна была показать вам результат поиска в случае его успеха. Это зависит от вас, как от программиста, сказать: «О, вот что я получаю от этого. Это те части, которые мне нужны. Я могу пойти отсюда». Строка pass предназначена только для того, чтобы пример скомпилировался для вас. Это комментарий «запускайте регулярное выражение и делайте что-то для каждой строки», который призван побудить вас добавить туда свою собственную логику. Вам нужно будет получить части, отслеживать итоги (СОВЕТ: defaultdict(int)) и так далее.

Mike 29.05.2019 01:47

Кроме того, я не уверен, что вы сказали «файл excel» в своем первоначальном сообщении. Я предполагал строки в текстовом файле. Вот так бы я пошел, если бы я был вами. Если он экспортируется как файл .csv, там будут запятые, и вам придется настроить регулярное выражение. В любом случае, это определенно выполнимо. (Боже. Если это файл Excel, вы, вероятно, можете сделать это в Excel!)

Mike 29.05.2019 01:49

Lol Я приблизился к тому, что мне нужно, только с Excel, но это все еще замедляет меня. Мне нужно скопировать информацию для каждого клиента в блокнот и добавить вкладки между каждым номером лицензии и названием лицензии, затем обработать в Excel, а затем скопировать из Excel в текстовый документ. Это работает, но это медленно. Формула, которую я использую в Excel: =СУММЕСЛИ(C1:C396,"Станция",B1:B396)+СУММЕСЛИ(C1:C396,"Станция",B1:B396)

Kevin Burris 29.05.2019 01:58

Вы должны иметь возможность экспортировать файл как файл .csv из Excel. Я считаю, что это File -> Export или File -> Save as...

Mike 29.05.2019 01:59

Спасибо за работу со мной. Я все еще новичок в Python, и мне удобнее всего использовать PyAutoGUI, поэтому в итоге я использовал только PyAutoGUI, functools и коллекции для удовлетворения своих потребностей. Спасибо еще раз.

Kevin Burris 30.05.2019 23:09
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)

Другие вопросы по теме