Как извлечь данные c целых подзаголовков из строки - PullRequest
0 голосов
/ 04 мая 2020

У меня есть большая текстовая строка, которая имеет несколько строк. Некоторые из этих строк имеют форму списка материалов следующим образом: Pls прокрутите вправо, чтобы увидеть полные данные.

DESCRIPTION                                                                                                                                             
GST IN USD               CHARGES IN USD\n    Freight charge - 139 KG @ USD 
0.70/KG                                                                                              
Zero Rated                             97.30\n    Warehouse Handling - 
Gateway 
Fee                                                                                                   
Zero Rated                             50.00\n    Handling - Origin Handling                                                                                                         
Zero Rated                             65.00\n    Delivery Cartage                                                                                                                   
Zero Rated                             75.00\n    Documentation fee                                                                                                                  
Zero Rated                             32.50\n\n\n\n\n    

Выше приведено текстовое представление фактического счета в формате PDF, которое выглядит следующим образом:

enter image description here

Мне нужен окончательный вариант вывод для формы:

{
  "Freight Charge": 97.30, 
  "Warehouse Handling": 50.00, 
  "Origin Handling": 65.00, 
  "Delivery cartage": 75.00
  "Documentation fee": 32.50
} 

Таким образом, в основном извлекаются основные затраты из соответствующих подзаголовков описания.

Однако проблема в том, что подзаголовки описания не являются фиксированными строками. Если бы это было так, я могу попробовать что-то вроде:

delivery_cartage = re.search(r"Delivery Cartage.*Zero Rated\s*(.*)",output).group(1)

documentation_fee = re.search(r"Documentation fee.*Zero Rated\s*(.*)",output).group(1)  

Для разных текстовых файлов описываемые подзаголовки отличаются, оставляя остальные столбцы (GST в долларах США) и фиксированными столбцы сборов в долларах США фиксированными. ,

Например для другого текстового файла у меня есть следующие подзаголовки в разделе ОПИСАНИЕ

DESCRIPTION                                                                                                                         
GST IN USD                CHARGES IN USD\n    
Freight charge - 833.5 KG @ USD 0.68/KG                                                                                        Zero   Rated                        566.78\n    
Terminal Handling Charges   IOR FEE                                                                                                Zero   Rated                      1,200.00\n    
Handling - 833.5 KG @ USD 0.50/KG                                                                                                  Zero   Rated                        416.75\n    
Delivery Cartage - 833.5 KG @ USD 0.25/KG                                                                                          Zero   Rated                        208.38\n    
Fuel Surcharge - 833.5 KG @ USD 0.25/KG                                                                                            Zero   Rated                        208.38\n    
War Risk Surcharge - 833.5 KG @ USD 0.14/KG                                                                                        Zero   Rated                        116.69\n\n\n\n\n    

, который выглядит ниже

enter image description here

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

{

  "Weight" : 398.00 KG,
  "VOLUME":4.99 M3,
  "CHAREGABLE":833.500 KG, 
  "PACKAGES" : 12 PLT, 

  "MAWB": 2394746354,
  "HAWB": SBCA20083746,

  "Freight Charge": 566.78, 
  "Terminal Handling Charges": 1200.00, 
  "Handling - 833.5": 416.75, 
  "Delivery Cartage": 208.38
  "Fuel Surcharge": 208.38
  "War Risk Surcharge:116.69
} 

Это полнотекстовая строка с полужирным черным цветом - ключи словаря, а красным - значения для соответствующих ключей, которые я хочу извлечь.

\n\n    INVOICE ABC005109692                                                                                                                                              Page 1 of 1\n\n                     ABC SERVICES PTE LTD (31-Jan-20\n                     CUSTOMER ID             SGARSCDABS\n                    SOUTH ST 3 #08-01                                                                               SHIPMENT                SSISA018830\n                     SINGAPORE 1234672                                                                                         DUE DATE                01-Mar-20\n                                                                                                                              TERMS                   30 days from Inv. Date\n                                                                                                                              INCOTERM                DDP - Delivered Duty Paid\n      **Try the e-Booking tool available for you through the IRIS portal**                               CONSOL NUMBER     C065938576823\n********************************************************************************************************************\n     SHIPMENT DETAILS                                                                                                SHIPPER                                                                                             CONSIGNEE\n    KUSU PTE LTD C/O ABC SERVICES PTE LTD                                                    MPMS ENTERPRISE - (ABC09987-V)\n    REFERENCE\n    128465504968, 53389/233973\n    GOODS DESCRIPTION\n    NETWORK BUNDLE,                     BASIC DEGREE, 1 RAIL INVOICE NO: 298773 SHIPPING REF: 094739\n    IMPORT CUSTOMS BROKER                                                **WEIGHT**                         **VOLUME**                    **CHARGEABLE**                **PACKAGES**\n                                                                         398.000 KG                     4.999 M3                  833.500 KG                12 PLT\n    FLIGHT / DATE                                                                                       **MAWB**                                    **HAWB**\n    / MB756 /                                                                                           **2394746354**                             **SBCA20083746**\n    GOODS COLLECTED FROM            SGSIN = Singapore , Singapore              ETD 07-Jan-20            GOODS DELIVERED TO        MYSHA = Alam , Malaysia     ETA   09-01-20 15:00\n\n    ORIGIN                          SGSIN = Singapore, Singapore               ETD    08-01-20 19:30    DESTINATION               MYKUL = Kuala Lumpur, Malaysia ETA     08-01-20 20:30\n\n    CHARGES\n    DESCRIPTION                                                                                                                         GST IN USD                CHARGES IN USD\n    **Freight charge - 833.5 KG @ USD 0.68/KG                                                                                            Zero   Rated                        566.78\n    Terminal Handling Charges   IOR FEE                                                                                                Zero   Rated                      1,200.00\n    Handling - 833.5 KG @ USD 0.50/KG                                                                                                  Zero   Rated                        416.75\n    Delivery Cartage - 833.5 KG @ USD 0.25/KG                                                                                          Zero   Rated                        208.38\n    Fuel Surcharge - 833.5 KG @ USD 0.25/KG                                                                                            Zero   Rated                        208.38\n    War Risk Surcharge - 833.5 KG @ USD 0.14/KG                                                                                        Zero   Rated                        116.69**\n\n\n\n\n    TOTAL CHARGES\n    Please contact us within 7 days should there be any discrepancies.                                                            SUBTOTAL                               2,716.98\n    Interest rate of 1.5% per month will be charged on overdue invoices.                                                              ADD GST                                0.00\n    NEW: Payment available 

Поэтому моя проблема в том, что я хочу извлечь все подзаголовки в столбце ОПИСАНИЕ вместе с соответствующей ценой в столбце ЗАРЯДЫ В USD и сохранить их как словарь, даже если строки подзаголовков не совпадают в разных текстовых файлах ,

Ответы [ 4 ]

0 голосов
/ 04 мая 2020

Так что я понял это.

Лучший способ - извлечь часть строки, которая находится между DESTINATION и TOTAL CHARGES.

Это извлечет строку между ними.

Теперь нам нужно извлечь подзаголовки под этим. Для этого мы сначала разбиваем линии, а затем создаем каждую строку в виде списка слов.

# Extracting the cost break up
cost_breakdown = re.search(
    r'(?s)(DESCRIPTION\s*GST IN USD\s*.+?TOTAL CHARGES)', output).group()

cost_breakdown = [
    re.split(r'\s{2,}', line.strip()) for line in cost_breakdown.splitlines() if line !=''
]

# dictionary of cost line items
cost_line_items = {line_item[0]: float(line_item[2]) for line_item in cost_breakdown[1:-1]}
0 голосов
/ 04 мая 2020

Возможно, расщепляется так:

#output = re.sub(' +', ' ', output)
subheader = output.split("Zero Rated")[0].split("-")[0].strip()
value = output.split("Zero Rated")[2].strip()
dict.update( {subheader : value} )
0 голосов
/ 04 мая 2020

Почему бы вам сначала не нормализоваться? Вот вам go:

import re
text = '''Freight charge - 833.5 KG @ USD 0.68/KG                                                                                            Zero   Rated                        566.78
Terminal Handling Charges   IOR FEE                                                                                                Zero   Rated                      1,200.00
Handling - 833.5 KG @ USD 0.50/KG                                                                                                  Zero   Rated                        416.75
Delivery Cartage - 833.5 KG @ USD 0.25/KG                                                                                          Zero   Rated                        208.38
Fuel Surcharge - 833.5 KG @ USD 0.25/KG                                                                                            Zero   Rated                        208.38
War Risk Surcharge - 833.5 KG @ USD 0.14/KG                                                                                        Zero   Rated                        116.69'''

list = [(re.split('\s{5,}', x)) for x in text.split('\n')]

rdd = []
for i in list:
    rdd.append((i[0].replace('  ', ' - ').split(' -')[0], i[2]))

print(rdd)
0 голосов
/ 04 мая 2020

Что же в заголовках? Может быть, все они расположены в начале строки и заканчиваются знаком da sh, разделенными пробелами. Поэтому правильное регулярное выражение должно выглядеть примерно так: ^([^\-]*)\s\-.*Zero Rated\s*(.*)

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