我的建議是使用鍵入5位數行代碼的字典。字典中的每個值可以是字段偏移量(或(偏移量,寬度)元組)的列表,由字段位置索引。
如果您的字段有其名稱可能可以方便地使用類而不是列表來存儲字段偏移數據。但是,namedtuples
在這裏可能會更好,因爲您可以通過其名稱或其字段位置訪問您的字段偏移數據,因此您可以獲得兩全其美的好處。
namedtuple
s的實際實現的類,但定義一個新namedtuple
型結構更加緊湊,創建一個明確的類定義,並namedtuples
使用__slots__
協議,所以他們採取了比使用__dict__
對於一個普通的類RAM較少存儲它的屬性。
下面是使用namedtuples
存儲的字段偏移量數據的一種方法。我並沒有聲稱下面的代碼是做這件事的最好方法,但它應該給你一些想法。
from collections import namedtuple
#Create a namedtuple, `Fields`, containing all field names
fieldnames = [
'record_type',
'special',
'communication',
'id_number',
'transaction_code',
'amount',
'other',
]
Fields = namedtuple('Fields', fieldnames)
#Some fake test data
data = [
# 1 2 3 4 5
#
"12455WE READ THIS TOO796445 125997 554777",
"22455 888AND THIS TOO796445 125997 55477778 2 1",
]
#A dict to store the field (offset, width) data for each field in a record,
#keyed by record type, which is always stored at (0, 5)
offsets = {}
#Some fake record structures
offsets['12455'] = Fields(
record_type=(0, 5),
special=None,
communication=(5, 28),
id_number=(33, 6),
transaction_code=(40, 6),
amount=(48, 6),
other=None)
offsets['22455'] = Fields(
record_type=(0, 5),
special=(6, 3),
communication=(9, 18),
id_number=(27, 6),
transaction_code=(34, 6),
amount=(42, 8),
other=(51,3))
#Test.
for row in data:
print row
#Get record type
rt = row[:5]
#Get field structure
fields = offsets[rt]
for name in fieldnames:
#Get field offset data by field name
t = getattr(fields, name)
if t is not None:
start, flen = t
stop = start + flen
data = row[start : stop]
print "%-16s ... %r" % (name, data)
print
輸出
12455WE READ THIS TOO796445 125997 554777
record_type ... '12455'
communication ... 'WE READ THIS TOO'
id_number ... '796445'
transaction_code ... '125997'
amount ... '554777'
22455 888AND THIS TOO796445 125997 55477778 2 1
record_type ... '22455'
special ... '888'
communication ... 'AND THIS TOO'
id_number ... '796445'
transaction_code ... '125997'
amount ... '55477778'
other ... '2 1'
是否有10層不同的可能的線結構,根據第一數字?不同的線路結構是否會相互不同?或者只有前幾個字段有所不同,所有後續字段保持不變,如示例中所示? –
他們基本上所有的變化見https://www.febelfin.be/sites/default/files/Standard-CODA-2.3-EN.pdf 的格式 – maazza
我看到只有一種方法,如下建議,創建多個記錄寬度結構,基於記錄的最初5位數代碼。請記住,標題記錄包含版本號,因此您可能必須根據數據版本允許不同的結構,或者您可能會發現在版本更改時無法解碼較舊的文件。我想問問問一個現場分隔符是多麼困難,但要求銀行改變什麼,是a)毫無意義,b)即使他們同意也需要幾年時間。 –