python-3.x 拆分字符串和添加字符串字符的问题

myzjeezk  于 2023-10-21  发布在  Python
关注(0)|答案(1)|浏览(143)

使用Python 3.10.10
我正在尝试遍历一个银行对账单字符串,其中包含七个元素,顺序如下:日期、描述、参考编号、交易日期、提取金额、存款金额和期末余额。描述是字符串中唯一有空格的部分,其余元素没有任何空格。
文本中大约有3.5K行,其中许多都有几个问题,例如:

  • 描述中的随机选项卡
  • 有时参考编号前没有制表符
  • 有时我会看到两个日期,比如24/12/2021 24/12/2021 sample description REFNO123456 24/12/2021 0.00 100.00 1000.00
  • 许多交易没有参考编号,它们仍然被正确地拆分和重新分配?

我已经从我自己的银行对账单中提取了这些数据,这是复制保护的,只有一个库工作,它将其导出为.txt,所以自己格式化似乎是唯一的选择。我现在正在努力修复线路,即使是ChatGPT也无法帮助这个,一直给出不起作用的代码。一个星期了,我只走了1000行。如果你能帮忙的话,我将不胜感激。
示例字符串:24/12/2021 sample description REFNO123456 24/12/2021 0.00 100.00 1000.00

f=open('/bankinfo final.txt','r')
txt=f.readlines()
cleanlist=[]
finalist=[]
for line in txt:
for x in line.split(sep=' '):
    if x!='':
        cleanlist.append(x)
    part1=(cleanlist[0])
    part2=(' '.join(cleanlist[1:-6]))
    part3=(' '.join(cleanlist[:-7:-1][::-1]))
    mashup=part1+'\t'+part2+'\t'.join(part3.split())
    finalist.append(mashup)
    mashup=''
    cleanlist=[]
f.close()
f=open('bankinfo parsed.txt','w')
f.write('\n'.join(finalist))
f.close()
jdgnovmf

jdgnovmf1#

欢迎来到正则表达式(regex)的世界。小心,许多人进入了regex的坟墓,但并不是所有人都出来了。
任何时候,当你解析字符串时,它只是有点复杂,你可能需要使用regex。您正在使用带空格的分割,但是空格不能保证与您观察到的一致,因此是时候做一些不同的事情了。下面的代码实现了您想要的大部分内容(我认为),并演示了findall()和组的一些关键regex概念,您可以在文档中查看。使用regex101检查正则表达式的工作也非常方便。
你没有在你的问题描述中涵盖所有可能的问题,所以我做了一些假设:

  • 所有交易行都有3个(取款、存款、余额):没有空包弹
  • 所有交易记录行至少有2个日期
  • 某些行具有带关键字符“REFNO”的REFNOxxxx
  • 描述可以包含空格、单词、制表符、日期、REFNO

从这样的东西开始,然后建立起来。如果你被卡住了,发布一个新的问题,说明什么样的行给你带来了错误,或者你需要什么类型的逻辑来更好地重新表达。这只是一个框架,你可以从这里工作,并组装你需要保存输出或 Dataframe ,等等。

DATA FILE(带制表符/空格/尾随空格等):

24/12/2021 sample description REFNO123456 24/12/2021 0.00 100.00 1000.00
30/12/2022 some other       description     REFNO55 30/12/2022 1.25 2.34 500.00   
1/1/2023 REFNO44 2/2/2023 0.00 0.02 512.23
2/2/2022            Balance check       2/2/2022 0.00 0.00 643.29
3/3/2022 description with a date: 4/4/2022 3/3/2022 0.00 5.66 787.99
5/5/2022 description with (6.33) amount 5/5/2022 0.21 2.22 888.44
6/6/2022 description with refno cancel: REFNO123 REFNO124 6/7/2022 0.44 5.99 902.44
--end of transaction list--

代码:

"""
read transactions
"""

import re

with open('txn_data.txt', 'r') as src:
    for line in src:
        line.strip()   # read a line and strip any trailing whitespace chars
        print('Analyzing: ', line)
        # find ALL of the dates in the line
        dates = re.findall(r'\d+\/\d+\/\d{4}', line)
        post_date = dates[0] if dates else None
        txn_date = dates[-1] if dates else None   # pick the last to avoid any date that might be in the description
        print(post_date, txn_date)

        # let's get the dollars
        # find 3 groups of digits, decimal, 2 digits separated by one or more whitespace chars
        amounts = re.search(r'(\d+\.\d{2})\s+(\d+\.\d{2})\s+(\d+\.\d{2})', line)
        if amounts:
            # print(amounts)
            withdrawal, deposit, balance = amounts[1], amounts[2], amounts[3]
            print(withdrawal, deposit, balance)
        else:
            withdrawal, deposit, balance = None, None, None

        # let's get the REFNO (if it exists)
        refnos = re.findall(r'REFNO\d+', line)
        refno = refnos[-1] if refnos else None  # get the LAST one in case there's one in description
        print(refno)
        if not all((post_date, txn_date, withdrawal, deposit, balance)):
            print('***** line not processed as a valid transaction!!')
        print()

输出:

Analyzing:  24/12/2021 sample description REFNO123456 24/12/2021 0.00 100.00 1000.00

24/12/2021 24/12/2021
0.00 100.00 1000.00
REFNO123456

Analyzing:  30/12/2022 some other       description     REFNO55 30/12/2022 1.25 2.34 500.00   

30/12/2022 30/12/2022
1.25 2.34 500.00
REFNO55

Analyzing:  1/1/2023 REFNO44 2/2/2023 0.00 0.02 512.23

1/1/2023 2/2/2023
0.00 0.02 512.23
REFNO44

Analyzing:  2/2/2022            Balance check       2/2/2022 0.00 0.00 643.29

2/2/2022 2/2/2022
0.00 0.00 643.29
None

Analyzing:  3/3/2022 description with a date: 4/4/2022 3/3/2022 0.00 5.66 787.99

3/3/2022 3/3/2022
0.00 5.66 787.99
None

Analyzing:  5/5/2022 description with (6.33) amount 5/5/2022 0.21 2.22 888.44

5/5/2022 5/5/2022
0.21 2.22 888.44
None

Analyzing:  6/6/2022 description with refno cancel: REFNO123 REFNO124 6/7/2022 0.44 5.99 902.44

6/6/2022 6/7/2022
0.44 5.99 902.44
REFNO124

Analyzing:  --end of transaction list--
None None
None
***** line not processed as a valid transaction!!

相关问题