求助: 两个文本处理任务

求助: 两个文本处理任务

我在一家银行工作,职责之一是每天要处理两种报文。这些报文每天有成百上千笔,手工处理效率实在低下。因此在这里寻求高手的帮助。

____________________________________________________________________

第一种(MT103):一种汇款报文。有固定的格式。以“{”表示开头,以“}”表示结束。这里指我方汇出的报文。

[Copy to clipboard] [ - ]
CODE:
{1:F01ABCDCNBJAAHX.SN..ISN..}{2:I103MRMDUS33XXXXN}{4:
:20:ABC123456
:23B:CRED
:32A:070123USD30000,00
:50K:/123456789
AAA IMPORT AND EXPORT CO., LTD
34, ZHONGHUA ROAD, SHANGHAI, CHINA
:53A:/222222
ABCDCNBJ
:57A:HSBCHKHH
:59:/33333333
BBB CO.,LTD
:71A:SHA
:70:INVOICE NO.456
:72:/ACC/YOUR KOWLOON BAY BRANCH
-}

说明:
第一行是报头:
1. {1:F01ABCDCNBJAAHX.SN..ISN..} 中的“ABCDCNBJ”是发报行,固定不变。
2. {2:I103MRMDUS33XXXXN} 中的“MRMDUS33XXX”是帐户行,会变化。
从第二行开始往下,都以冒号开头,是报文正文:
3. :20: 发报行业务编号。 长度不定
4. :23B: 固定格式,不用理会
5. :32A: 依次为日期、币种、金额。 日期固定6位数字,币种固定3位字母,金额中的点写为逗号
6. :50K: /后面为汇款人帐号,下面一行为汇款人名称,再下面为汇款人地址
7. :53A: 这一栏內容固定,不需要
8. :57A: 收款人开户银行。8位或11位字母。
    有时无SWIFT CODE,使用收款行的全称:
   :57D:HSBC BANK, HONG KONG BRANCH
9. :59: /后为收款人帐户,下面为收款人名称,地址(如有)
10. :71A: 费用方式,有三种可能:SHA, BEN, OUR
11. :70: 给收款人的附言,自由格式,最长可有四行
12. :72: 给收款银行的附言,最多四行,第一行需以“/ACC/”开头,以下行以“//”开头

需求:
先把每笔报文放到一个txt文件中,如103.txt,然后用python等工具搜索每笔报文,把每一笔报文的內容按如下栏位添加到excel中,制成一个台帐,以便查询。带星号的是必输项。(括号內以上述报文为例)

帐户行 (MRMDUS33) *
发报行业务编号 (ABC123456) *
日期 (070123) *
币种 (USD) *
金额 (30000,00) *
汇款人 (AAA IMPORT AND EXPORT CO., LTD) *
收款银行 (HSBCHKHH)
收款人帐号 (33333333) *
收款人名称 (BBB CO.,LTD) *
费用方式 (SHA) *
附言 (INVOICE NO.456)
银行附言 (YOUR KOWLOON BAY BRANCH)

如果不是放到excel,而是有其他办法,只要方便以后查询就行。也行。

____________________________________________________________________

第二种(MT999):是一种事务报文,以“{”表示开头,以“}”表示结束。这里指我方收到的国外银行来电。如:

[Copy to clipboard] [ - ]
CODE:
{1:F21ABCDCNBJAAHX5316124118}{4:{177:0701240840}{451:0}}{1:F01ABCDCNBJAAHX5316124118}{2:O9991208070122COMMSGSGAXXX26240330270701221208N}{3:{108:S06E000663      }}{4:
:20:S06E000663
:21:5502100567
:79:PLS BE ADVISED THAT THE A/M BILL FOR
USD2,000,000.00 WILL BE DUE FOR PAYMENT
ON 30 JAN 2007.
.
AT MATURITY, KINDLY REMIT PROCEEDS BY T/T TO OUR
A/C NO. 998877 WITH BANK OF COMMUNICATIONS,
NEW YORK VIA CHIPS UID 368220 UNDER YOUR SWIFT
ADVICE TO US QUOTING OUR REF. NO.
.
REGARDS
TRADE FINANCE
-}{5:{CHK:AD99C609160B}}

说明:

:20: 这一行是发报行的编号
:21: 这一行是收报行的编号
:79: 从这一行一直到倒数第二行是报文正文。

需求:
我所在单位在全省各地都有分支机构,每个机构都有10位的机构编号。前五位为地区代码:
55001 A支行
55002 B支行
55003 C支行
... ...
55021
55022
都以55开头。后五位是业务编号。

对方来的报文中一般会在21栏引用我方的编号。但有时不在21栏,而是出现在正文(79栏)中。

我想做的是,先把所有来报放到一个txt文件中,如999.txt,然后用python等工具搜索每笔报文,如果发现我方机构号的前五位,如55013,则在999.txt所在目录新建一个55013.txt文件,把这笔报文复制过去。如果55013.txt已经存在,则添加这笔报文。最后的结果是,发给每个地区的报文都放到对应的文件中。如,所有给55013机构的报文都放到55013.txt文件中。如果有些报文没有我方编号,则放到一个tmp.txt文件中,由人工处理。之后,用邮件工具把每个文件发到对应机构的信箱中。

____________________________________________________________________

python是一种强大的编程工具,文本处理能力非常强。我只会做简单的小脚本,上面这两个任务做不出。这两个任务犹以第二个急需。
请指点在下如何用python处理?
多谢!

跟船公司的EDI一样,不过俺这边处理的EDI全是用别的语言写的奥,不是用python
00DOCSHIPPING DOCUMENT     KLINE   PENQIN                          0612121410LCNTAOCNTAOCNTAOCNTAOKLINE        3.1N        
11   KL   CBB   CHESAPEAKE BAY BRIDG18W  061214061214                                                                           
12   KKLUJP0919184                                                  JPTYOJPTYOCY-CY     YN000000                                
13   CNTAOCNTAOQINGDAO,,CN                                                                                                      
16                    KAWASAKI KISEN KAISHA, LTD.                                           TOKYO                              
21                    KLINE QINGDAO                                                                                             
26   1                 KLINE QINGDAO                                                                                             
41   001EMP              N000100   UNITS          0002000000000000000000000000                                                  
44   001001NO MARK                                                                                                               
47   001EMPTY CONTAINERS  20'DRY(8'6")X 100                                                                              
51   001KKTU7017944           2200NFCY-CY     000001PKGS    02000000000000000000                                                
51   001KKTU7134215           2200NFCY-CY     000001PKGS    02000000000000000000                                                
51   001KKTU7134180           2200NFCY-CY     000001PKGS    02000000000000000000                                                
51   001KKTU7133224           2200NFCY-CY     000001PKGS    02000000000000000000                                                
51   001KKTU7132573           2200NFCY-CY     000001PKGS    02000000000000000000                                                
51   001KKTU7130924           2200NFCY-CY     000001PKGS    02000000000000000000
解析这个用python实在太简单了,你只要学习一下 正则模块,和简单的split, find等命令就可以做了。
只要熟悉正则,就不会很困难,我试着写了第一个文本处理的正则,第二我想大同小异!

[Copy to clipboard] [ - ]
CODE:
# -*- coding: cp936 -*-
des=[(r'2:I103(.*)}',0,'帐户行'),\
     (r':20:(.*)\n',0,'发报行业务编号'),\
     (r':32A:(\d{6})',0,'日期'),\
     (r':32A:\d{6}(\D+)\d',0,'币种'),\
     (r':32A:\d{6}\D+(\d+.*)\n',0,'金额'),\
     (r':50K:.*\n(.*)\n',0,'汇款人'),\
     (r'(:57A:|:57D:)(.*)\n',1,'收款银行'),\
     (r':59:/(.*)\n',0,'收款人帐号'),\
     (r':59:/.*\n(.*)\n',0,'收款人名称'),\
     (r':71A:(.*)\n',0,'费用方式'),\
     (r':70:(.*)\n',0,'附言'),\
     (r':72:/ACC/(.*\n*.*\n*.*\n*.*)\n-}',0,'银行附言')]
fp=open('d:\\mytmp\\tele.txt') #这里是你的报文
s=fp.read()
fp.close()
import re
for line in des:
    #print line
    if re.search(line[0],s):
        print line[2],"(",re.search(line[0],s).groups()[line[1]].replace('\n',' ').replace('//',' '),")"