Как нормализовать отчет в формате txt, используя регулярное выражение, которое включает повторяющиеся заголовки для строк в python? - PullRequest
0 голосов
/ 12 февраля 2020

Я пытаюсь нормализовать это в кадре данных, который будет иметь следующие поля:

  • Parent_Account - это четыре числа di git, в которых в балансе / деятельности нет суммы в долларах Это должно повторяться для каждого sub_account
  • Parent_Description - описание, найденное рядом с родительским аккаунтом. Это должно повторяться для каждого sub_account
  • Sub_Account - это числа, которые также имеют «-» и следуют за первым «-»
  • Center - третьим уровнем в учетной записи. Далее следует второе «-». Это не всегда присутствует и в этом случае будет пустым.
  • Sub_Description - описание для Sub_Account
  • Beginning_Balance - число под Начальным балансом. Если рядом с номером есть «cr», это должно быть число, умноженное на -1
  • Period_Activity - число в поле Activity периода. Если рядом с номером стоит «cr», это должно быть число, умноженное на -1
  • Ending - число под Ending. Если рядом с номером стоит «cr», это должно быть число, умноженное на -1

. Вот как мои данные выглядят в текстовом файле.

import pandas as pd
import numpy as np
import re

string = """ gltbrp.p 2+                                         25.15.4 Trial Balance Summary                                     Date: 10/02/20
Page:    1                                                    COMP AB&E                                              Time: 16:24:55

COMP AB & E                                               Reporting Currency:   NIS
                                                           Exchange Rate:


                                                       Beginning Balance     Period Activity      Ending Balance
Account                Description                          01/01/19                                 31/12/19       Adjust Balance
----------------------- ------------------------      -------------------  -------------------  ------------------- ------ -------
 1010                   Cash-Deposit-0 Bal., FC 
 1010-1111               CFS RECEIVABLES CASH BOO            848,377.90           646,932.39         1,495,310.29  
 1010-2611               INTER ACCOUNT TRANSFERS           4,453,872.12cr        15,804,424.27        20,258,296.39  
 1010-9122               DEFAULT SUB-ACCOUNT CODE          1,088,346.84         1,423,931.41cr         2,512,278.25  
 1012                   Cash-Disburse-0 Bal.,FC 
 1012-1114               QUEENSMAIN ACCOUNT              9,193,838.58         3,141,528.70cr       6,052,309.88  
 1014                   EURO CONTROL ACCT       
 1014-9122               DEFAULT SUB-ACCOUNT CODE EUR          2,789.21            11,403.07cr           8,613.86cr
 1016                   USD CONTROL ACCT        
 1016-9122               DEFAULT SUB-ACCOUNT CODE USD               .00            78,484.56            78,484.56  
 1022                   EURO BANK ACCOUNTS      
 1022-9122               DEFAULT SUB-ACCOUNT CODE EUR      5,055,924.60         1,342,240.47cr       3,713,684.13  
 1023                   USD BANK ACCOUNTS       
 1023-9122               DEFAULT SUB-ACCOUNT CODE USD      4,744,992.89         1,680,118.33cr       3,064,874.56  
 1042                   Cash-Disb.-Non.0 Bal,NFC
 1042-1162               CURR HK$ & CHINESE RMB                  330.76               330.76cr                .00  
 1100                   Accounts Rec.-Trade:FC  
 1100-1311               CFS RECEIVABLES TRADE            23,103,558.73         4,369,946.25cr      18,733,612.48  
 1100-WBAB               CFS ACCRUED RECEIVABLES             101,096.06cr           4,251.26            96,844.80cr
 1100-WBAB-1501           MAXIFIT < 300MM                    310,266.12cr          44,420.84           265,845.28cr
 1100-1315               SALES REBATES                     1,150,318.67cr          35,024.14cr       1,185,342.81cr
 1100-1315-1093           Commpac                             46,439.08cr          15,999.96cr          62,439.04cr
 1100-1315-1102           HNH IRON BALANCING                 654,359.47cr         156,251.52cr         810,610.99cr
 1100-1315-1501           MAXIFIT < 300MM                    351,099.82cr          63,893.90cr         414,993.72cr
 1100-1316               CONTACTOR REBATES                 3,804,172.43cr       2,073,515.44         1,730,656.99cr
 1100-1316-1093           Commpac                            382,263.81cr          19,739.11cr         402,002.92cr
 1100-1316-1102           HNH IRON BALANCING               1,827,536.88cr         486,674.25         1,340,862.63cr
 1100-1316-1501           MAXIFIT < 300MM                    865,491.17cr         610,548.87cr       1,476,040.04cr
 1100-1316-1502           MAXIFIT > 300MM                    321,028.94cr          73,990.76           247,038.18cr
 1100-1317               SALES REBATE CONTROL ACC          2,879,225.96cr         682,081.36         2,197,144.60cr
 1100-1317-1093           Commpac                             18,955.18cr          12,405.87             6,549.31cr
 1100-1317-1102           HNH IRON BALANCING               1,499,613.14cr         377,041.56         1,122,571.58cr
 1100-1318               Hattersley Rebates                   22,470.58cr           4,449.48cr          26,920.06cr
 1100-1318-1102           HNH IRON BALANCING                  48,921.90cr          10,152.79cr          59,074.69cr
 1100-1319               VAT TRANSFER CONTRA               2,981,496.28cr       1,243,140.41         1,738,355.87cr
 1100-1319-1501           MAXIFIT < 300MM                  1,627,262.29cr         134,977.01         1,492,285.28cr
 1100-2315               AR/AP CREDIT BAL SWITCH          11,810,820.05cr         869,957.47        10,940,862.58cr
 1100-2315-1501           MAXIFIT < 300MM                 11,810,820.05           869,957.47cr      10,940,862.58  
 1100-9122               DEFAULT SUB-ACCOUNT CODE            485,594.24           254,072.72cr         231,521.52  
 1100-9122-1501           MAXIFIT < 300MM                    294,857.51             5,354.08cr         289,503.43  
 1102                   EURO ACCOUNTS RECEIVABLE
 1102-9122               DEFAULT SUB-ACCOUNT CODE EUR      2,433,435.33         1,022,867.13cr       1,410,568.20  
 1103                   USD ACCOUNTS RECEIVABLE 
 1103-9122               DEFAULT SUB-ACCOUNT CODE USD      1,801,882.57           250,490.33         2,052,372.90  
 1124                   V.A.T. Receivable       
 1124-9122               DEFAULT SUB-ACCOUNT CODE          2,981,496.28         1,243,140.41cr       1,738,355.87  
 1124-9122-1501           MAXIFIT < 300MM                  1,627,262.29           134,977.01cr       1,492,285.28  
 1132                   Other Rec.-Charges Rebil
 1132-1355               CLAIMS - RECOVERABLE                  1,044.43             5,029.58cr           3,985.15cr
 1138                   Other Rec.-Employee Rec.
gltbrp.p 2+                                         25.15.4 Trial Balance Summary                                     Date: 10/02/20
Page:    2                                                    COMP AB&E                                              Time: 16:24:56

COMP BS & U                                               Reporting Currency:   NIS
                                                           Exchange Rate:


                                                       Beginning Balance     Period Activity      Ending Balance
Account                Description                          01/01/19                                 31/12/19       Adjust Balance
----------------------- ------------------------      -------------------  -------------------  ------------------- ------ -------
 1138-1321               ADVANCES TO EMPLOYEES                   100.00               100.00cr                .00  
 1138-1323               TRAVEL ADV ALL EMPLOYEES              2,357.42             1,219.98cr           1,137.44  
 1156                   Other Rec.-Pension Rec. 
 1156-9122               DEFAULT SUB-ACCOUNT CODE              8,008.59             1,914.69cr           6,093.90  
 1160                   Other Rec.-Rent Rec.    
 1160-9122               DEFAULT SUB-ACCOUNT CODE              3,150.00                  .00             3,150.00  
 1172                   Other Rec.-Miscellaneous
 1172-1333               COMP FUND                                 .00             6,618.31             6,618.31  
 1172-9122               DEFAULT SUB-ACCOUNT CODE             26,242.01           115,117.97cr          88,875.96cr

               Beginning Date: 01/01/19
                  Ending Date: 31/12/19
       Summarize Sub-Accounts: No
       Summarize Cost Centers: No
                     Currency: NIS
        Suppress Zero Amounts: Yes
    Round to Nearest Thousand: No
  Round to Nearest Whole Unit: No
           Reporting Currency:                               Output: text
                                                           Batch ID:
"""

Мой код, с которым я борюсь. Я только что распечатал вывод, чтобы увидеть, если он правильный. Группа (1), кажется, захватывает Sub_Accounts, но другие группы не работают. Здесь на самом деле пробуют разные вещи, но безуспешно.

activity_re = re.compile(r'\s(\d+-\w+(-\w+)?)\s+(.+)(\s{2,})')

for line in lines_read.split('\n'):
    line=activity_re.search(line)
    if line:
        print(line.group(1))

Пример желаемого вывода для учетной записи 1010. В этом случае нет номера «Центр», поэтому он пуст. enter image description here

1 Ответ

1 голос
/ 12 февраля 2020

re, безусловно, отличный инструмент, но он здесь бесполезен, потому что у нас есть файл полей фиксированной длины.

Важно удалить все строки заголовков и обработать только соответствующие: a Переменной состояния достаточно, чтобы отслеживать, обрабатываем ли мы заголовки или строки данных.

Наконец, pandas DataFrame должен передаваться за один проход, потому что их базовые контейнеры - это numpy массивы, которые действительно разрешить быструю обработку, но там, где добавление новых значений стоит дорого.

Так что я бы построил список или лучше словарь для каждой строки данных, сохранил бы все эти записи в списке и, в конце концов, заполнил бы DataFrame этим списком записей , Код может предполагать, что строка содержит ваши образцы данных):

import pandas as pd
import io

header = True

def money(s):
    """Convert a number having ',' as thousand separator and a trailing cr
as negative sign to an ordinary float"""
    neg = s.endswith('cr')
    s = s.strip('cr').replace(',', '')
    return float(s) if not neg else - float(s)

data = []
colnames = ['Parent_Account', 'Parent_Description', 'Sub_Account',
        'Center', 'Sub_Description', 'Beginning_Balance',
        'Period_Activity', 'Ending']

for line in io.StringIO(string):
    if header:
        if line.strip().startswith('----------'):
            header = False
        continue
    else:
        if line.strip().startswith('gltbrp') or len(line.strip()) == 0:
            header = True
            continue
    # extract the fields from the line
    acc = line[:23].strip()
    desc = line[24:53].strip()
    begin = line[54:74].strip()
    period = line[75:95].strip()
    end = line[96:].strip()

    acc_details = len(acc.split('-', 2))
    if acc_details == 1:     # a parent record: only store parent values
        parent_row = {'Parent_Account': acc, 'Parent_Description': desc}
    else:
        row = parent_row.copy()  # initialize parent values
        if acc_details == 2:
            row['Sub_Account'] = acc[5:]
            row['Sub_Description'] = desc
            row['Center'] = ''
        else:
            row['Center'] = acc.split('-', 2)[2]
        row['Beginning_Balance'] = money(begin)
        row['Period_Activity'] = money(period)
        row['Ending'] = money(end)
        parent_row = row        # keep relevant fields for following record
        data.append(row)

df = pd.DataFrame(data, columns = colnames)

, что дает для df:

   Parent_Account        Parent_Description Sub_Account Center               Sub_Description  Beginning_Balance  Period_Activity       Ending
0            1010   Cash-Deposit-0 Bal., FC        1111             CFS RECEIVABLES CASH BOO          848377.90        646932.39   1495310.29
1            1010   Cash-Deposit-0 Bal., FC        2611              INTER ACCOUNT TRANSFERS        -4453872.12      15804424.27  20258296.39
2            1010   Cash-Deposit-0 Bal., FC        9122             DEFAULT SUB-ACCOUNT CODE         1088346.84      -1423931.41   2512278.25
3            1012   Cash-Disburse-0 Bal.,FC        1114                   QUEENSMAIN ACCOUNT         9193838.58      -3141528.70   6052309.88
4            1014         EURO CONTROL ACCT        9122         DEFAULT SUB-ACCOUNT CODE EUR            2789.21        -11403.07     -8613.86
5            1016          USD CONTROL ACCT        9122         DEFAULT SUB-ACCOUNT CODE USD               0.00         78484.56     78484.56
6            1022        EURO BANK ACCOUNTS        9122         DEFAULT SUB-ACCOUNT CODE EUR         5055924.60      -1342240.47   3713684.13
7            1023         USD BANK ACCOUNTS        9122         DEFAULT SUB-ACCOUNT CODE USD         4744992.89      -1680118.33   3064874.56
8            1042  Cash-Disb.-Non.0 Bal,NFC        1162               CURR HK$ & CHINESE RMB             330.76          -330.76         0.00
9            1100    Accounts Rec.-Trade:FC        1311                CFS RECEIVABLES TRADE        23103558.73      -4369946.25  18733612.48
10           1100    Accounts Rec.-Trade:FC        WBAB              CFS ACCRUED RECEIVABLES         -101096.06          4251.26    -96844.80
11           1100    Accounts Rec.-Trade:FC        WBAB   1501       CFS ACCRUED RECEIVABLES         -310266.12         44420.84   -265845.28
12           1100    Accounts Rec.-Trade:FC        1315                        SALES REBATES        -1150318.67        -35024.14  -1185342.81
13           1100    Accounts Rec.-Trade:FC        1315   1093                 SALES REBATES          -46439.08        -15999.96    -62439.04
14           1100    Accounts Rec.-Trade:FC        1315   1102                 SALES REBATES         -654359.47       -156251.52   -810610.99
15           1100    Accounts Rec.-Trade:FC        1315   1501                 SALES REBATES         -351099.82        -63893.90   -414993.72
16           1100    Accounts Rec.-Trade:FC        1316                    CONTACTOR REBATES        -3804172.43       2073515.44  -1730656.99
17           1100    Accounts Rec.-Trade:FC        1316   1093             CONTACTOR REBATES         -382263.81        -19739.11   -402002.92
18           1100    Accounts Rec.-Trade:FC        1316   1102             CONTACTOR REBATES        -1827536.88        486674.25  -1340862.63
19           1100    Accounts Rec.-Trade:FC        1316   1501             CONTACTOR REBATES         -865491.17       -610548.87  -1476040.04
20           1100    Accounts Rec.-Trade:FC        1316   1502             CONTACTOR REBATES         -321028.94         73990.76   -247038.18
21           1100    Accounts Rec.-Trade:FC        1317             SALES REBATE CONTROL ACC        -2879225.96        682081.36  -2197144.60
22           1100    Accounts Rec.-Trade:FC        1317   1093      SALES REBATE CONTROL ACC          -18955.18         12405.87     -6549.31
23           1100    Accounts Rec.-Trade:FC        1317   1102      SALES REBATE CONTROL ACC        -1499613.14        377041.56  -1122571.58
24           1100    Accounts Rec.-Trade:FC        1318                   Hattersley Rebates          -22470.58         -4449.48    -26920.06
25           1100    Accounts Rec.-Trade:FC        1318   1102            Hattersley Rebates          -48921.90        -10152.79    -59074.69
26           1100    Accounts Rec.-Trade:FC        1319                  VAT TRANSFER CONTRA        -2981496.28       1243140.41  -1738355.87
27           1100    Accounts Rec.-Trade:FC        1319   1501           VAT TRANSFER CONTRA        -1627262.29        134977.01  -1492285.28
28           1100    Accounts Rec.-Trade:FC        2315              AR/AP CREDIT BAL SWITCH       -11810820.05        869957.47 -10940862.58
29           1100    Accounts Rec.-Trade:FC        2315   1501       AR/AP CREDIT BAL SWITCH        11810820.05       -869957.47  10940862.58
30           1100    Accounts Rec.-Trade:FC        9122             DEFAULT SUB-ACCOUNT CODE          485594.24       -254072.72    231521.52
31           1100    Accounts Rec.-Trade:FC        9122   1501      DEFAULT SUB-ACCOUNT CODE          294857.51         -5354.08    289503.43
32           1102  EURO ACCOUNTS RECEIVABLE        9122         DEFAULT SUB-ACCOUNT CODE EUR         2433435.33      -1022867.13   1410568.20
33           1103   USD ACCOUNTS RECEIVABLE        9122         DEFAULT SUB-ACCOUNT CODE USD         1801882.57        250490.33   2052372.90
34           1124         V.A.T. Receivable        9122             DEFAULT SUB-ACCOUNT CODE         2981496.28      -1243140.41   1738355.87
35           1124         V.A.T. Receivable        9122   1501      DEFAULT SUB-ACCOUNT CODE         1627262.29       -134977.01   1492285.28
36           1132  Other Rec.-Charges Rebil        1355                 CLAIMS - RECOVERABLE            1044.43         -5029.58     -3985.15
37           1138  Other Rec.-Employee Rec.        1321                ADVANCES TO EMPLOYEES             100.00          -100.00         0.00
38           1138  Other Rec.-Employee Rec.        1323             TRAVEL ADV ALL EMPLOYEES            2357.42         -1219.98      1137.44
39           1156   Other Rec.-Pension Rec.        9122             DEFAULT SUB-ACCOUNT CODE            8008.59         -1914.69      6093.90
40           1160      Other Rec.-Rent Rec.        9122             DEFAULT SUB-ACCOUNT CODE            3150.00             0.00      3150.00
41           1172  Other Rec.-Miscellaneous        1333                            COMP FUND               0.00          6618.31      6618.31
42           1172  Other Rec.-Miscellaneous        9122             DEFAULT SUB-ACCOUNT CODE           26242.01       -115117.97    -88875.96

Примечание: согласно вашему требованию, описание Центра просто опущено в моем коде, но было бы тривиально изменить его, чтобы добавить этот столбец в фрейм данных.

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