Разбор большого текстового документа, чтобы сохранить только «номер счета» и заданное ключевое слово c («Рыночная стоимость») - PullRequest
0 голосов
/ 05 февраля 2020

У меня большой текстовый документ (~ 20000 строк), тело которого выглядит примерно так:

Invoice Account / Name: 
0234523454 / XYZCORPORATIONS
Charge Group
Portfolio Fee
Date
Our / Your Ref
Security / Category
Charge Item
No of Units
Market Value
Charge Amt Invoice Amt
30-Sep-2019
Debt Instruments
PORTFOLIO FEE
CS
USD 
USD 219.12 USD 219.12
14,136,666.31
 Invoice Account / Name: 
021346676343/ abcdefgcopr
M0919-031  / Page 3 of 35
Charge Group
Portfolio Fee
Date
Our / Your Re
Security / Category
Charge Item
No of Units
Market Value
Charge Amt Invoice Amt
30-Sep-2019
Equity Instruments
USD 788,640.00 USD 12.22
USD 12.22
PORTFOLIO FEE-
EC_CS
 Invoice Account / Name: 
123498761233/ somethingelsecorporation
Charge Group
Portfolio Fee
Date
Our / Your Ref

Подобные блоки повторяются тысячи раз. Попытка вывода:

Invoice Account / Name: 
    0234523454 / XYZCORPORATIONS
Market Value
Invoice Account / Name: 
    021346676343/ abcdefgcopr
Market Value
Invoice Account / Name: 
    123498761233/ somethingelsecorporation
Market Value

Поскольку я никогда не пытался сделать что-то подобное раньше, у меня есть два вопроса:
1. Как определить и сохранить предложение вроде этого:

Invoice Account / Name: 
0234523454 / XYZCORPORATIONS

У которого нет фиксированной длины?

  1. Как сохранить только ключевое слово "Рыночная стоимость", кроме этого.

Разумно ли использовать для этого nltk? Или это может быть обработано с помощью регулярных выражений и обработки строк?

Ответы [ 2 ]

2 голосов
/ 05 февраля 2020

Вы можете достичь этого, используя только regex:

import re

with open('file.txt', 'r') as f:
    matches = re.findall('Invoice Account \/ Name:\n.*', f.read())

with open('result.txt', 'w') as f:
    [f.write(f'{m}\nMarket Value\n') for m in matches]

Выходной файл:

Invoice Account / Name:
0234523454 / XYZCORPORATIONS
Market Value
Invoice Account / Name:
021346676343/ abcdefgcopr
Market Value
Invoice Account / Name:
123498761233/ somethingelsecorporation
Market Value
1 голос
/ 05 февраля 2020

Вы можете просто использовать обработку строк для поиска и поиска того, что ищете.

result = []

with open('num.txt', 'r') as file:
    data = list(file.readlines())

    for indx, row in enumerate(data): 
        if 'Invoice Account' in row:

            accountnumber = data[indx+1].split('/')[0].strip() # Get account number from next line
            companyname = data[indx+1].split('/')[1].strip() # Get company name from next line

            # Store all results in a dictionary, you could print, store in other ways as well.

            info = {'Account Number': accountnumber,
                    'Company Name': companyname,
                    'Market Value': '',
                }

            # Append the dictionary to a list called result
            result.append(info)

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

for data in result:
    print(f"""Account Name: {data['Company Name']}
Account Number: {data['Account Number']}
Market Value: {data['Market Value']}
""")

Выход:

Account Name: XYZCORPORATIONS
Account Number: 0234523454
Market Value: 

Account Name: abcdefgcopr
Account Number: 021346676343
Market Value: 

Account Name: somethingelsecorporation
Account Number: 123498761233
Market Value: 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...