0

我需要读取 AFP 文件并提取它的 TLE,例如帐号、客户全名…… AFP 文件格式正确,结构非常清晰。我不想添加任何外部库。

4

2 回答 2

0

它是用 Python 编写的,我很久以前就写过它,从那以后就再也没有碰过它,但它确实有效。我会添加一些评论,但我不记得关于它的任何事情。可能有点用。

import datetime
start = datetime.datetime.now() 

statementlist=[]
ptxlist = []

with open('C:\\temp\\AFP\\bigfile', 'rb') as fs:
    bngcmd = b'\xA8\xAD'
    engcmd = b'\xA9\xAD'
    ptxcmd = b'\xEE\x9B'
    tlecmd = b'\xA0\x90'
    inDoc = False

    while True:
        # 'Read SFI header info
        byte = fs.read(6)
        if not byte:
            break
        # 'get command info
        SFICommand = byte[4:6]
        SFISize = (byte[1]<<8) + byte[2]
        if not inDoc and SFICommand == bngcmd:
            inDoc = True
            ptx = bytearray()
            fs.read(SFISize-5)
        elif inDoc and SFICommand == engcmd:
            inDoc = False
            ptxlist.append(ptx)
            currentsize = 0
            fs.read(SFISize-5)
        elif inDoc and SFICommand == ptxcmd:
            fs.read(3)
            ptx.extend(bytearray(fs.read(SFISize-8)))
        else:
            fs.read(SFISize-5)

inptxcmd = b'\x2B\xD3'
for ptx in ptxlist:
    i = 0
    ptxlength =len(ptx)
    utfstring=''
    while i < ptxlength:
        if ptx[i:i+2] == inptxcmd:
            i+=2

        ptxsize = ptx[i]
        ptxcmd = ptx[i+1]
        
        if ptxcmd == 0xDA or ptxcmd == 0xDB:
            utfstring += ptx[i+2:i+ptxsize].decode("EBCDIC-CP-BE").strip() + '\u0009'

        i+=ptxsize

    statementlist.append(utfstring + '\n')

with open('C:\\temp\\AFP\\pythonout.txt', 'w',encoding='ASCII') as outfile:
    for statement in statementlist:
        outfile.write(statement)
于 2020-08-03T18:43:11.850 回答
0

AFP 是一种简单的格式,它由结构化字段组成,您的第一步是对其进行解码,下载此:“混合对象文档内容架构参考”阅读前 50 页并编写代码将 afp 拆分为结构化字段,以便创建一个简单的转储您的文件。

好工作

于 2020-07-29T07:44:00.637 回答