我正在解析基于偏移量的ISO-8859-15数据。每行一个条目。没有关于随机行上的数据和程序崩溃的文档,所以我添加了调试功能,以查看偏移匹配以及其他描述字段。
import os
import sys
import logging
log = logging.getLogger(__name__)
logging.basicConfig(
stream=sys.stdout,
level=logging.DEBUG,
)
structure = {
# Internal
0: {"descr": "Tietuetunnus", "name": "id", "skip": True},
5: {"descr": " Ajopäivämäärä", "name": "rundate", "skip": True}, # Date
# Post code
13: {"descr": " Postinumero", "name": "postcode", "skip": False},
18: {"descr": " Postinumeron nimi suomeksi", "name": "fi_postcodename", "skip": False},
48: {"descr": " Postinumeron nimi ruotsiksi", "name": "se_postcodename", "skip": False},
# Short name
78: {"descr": " Postinumeron nimen lyhenne suomeksi", "name": "fi_postcodename_short", "skip": False},
90: {"descr": " Postinumeron nimen lyhenne ruotsiksi", "name": "se_postcodename_short", "skip": False},
# Street name
102: {"descr": "Kadun (paikan) nimi suomeksi", "name": "fi_streetname", "skip": False},
132: {"descr": "Kadun (paikan) nimi ruotsiksi", "name": "se_streetname", "skip": False},
# Internal
162: {"descr": "Tyhjä", "name": "empty1", "skip": True},
174: {"descr": "Tyhjä", "name": "empty2", "skip": True},
# Property type
186: {"descr": "Kiinteistötietojen tyyppi", "name": "propertytype", "skip": False}, # 1 = odd 2 = even
# Property (large)
187: {"descr": "Kiinteistönumero 1", "name": "small_propertynumber1", "skip": False},
192: {"descr": "Kiinteistön jakokirjain 1", "name": "small_property1mark", "skip": False},
193: {"descr": "Välimerkki", "name": "small_mark", "skip": True}, # Internal
194: {"descr": "Kiinteistönumero 2", "name": "small_propertynumber2", "skip": False},
199: {"descr": "Kiinteistön jakokirjain 2", "name": "small_property2mark", "skip": False},
# Property (small)
200: {"descr": "Kiinteistönumero 1", "name": "large_propertynumber1", "skip": False},
205: {"descr": "Kiinteistön jakokirjain 1", "name": "large_property1mark", "skip": False},
206: {"descr": "Välimerkki", "name": "large_mark", "skip": True}, # Internal
207: {"descr": "Kiinteistönumero 2", "name": "large_property2mark", "skip": False},
212: {"descr": "Kiinteistön jakokirjain 2", "name": "large_propertynumber2", "skip": False},
# Municipality
213: {"descr": "Kunnan koodi", "name": "municipalitycode", "skip": False},
216: {"descr": "Kunnan nimi suomeksi", "name": "fi_municipality", "skip": False},
236: {"descr": "Kunnan nimi ruotsiksi", "name": "se_municipality", "skip": False},
}
def add_debug_offsets(line, offsets, marker="^", descrfield="descr"):
o = ""
o += line + os.linesep
markerline = list(" " * len(line))
offset_list = []
for i in map(int, offsets.keys()):
offset_list.append(i)
markerline[i] = marker
o += "".join(markerline) + os.linesep
offset_list = list(reversed(sorted(offset_list)))
for offset in offset_list:
for i in range(offset):
if i in offset_list:
o += "|"
else:
o += " "
o += "-- " + offsets[offset][descrfield] + os.linesep
return o
示例数据:
KATUN2017072204600MÄNTSÄLÄ MÄNTSÄLÄ Venlanpolku 2 2 - 4a 2 - 4b505Mäntsälä Mäntsälä
这会生成例如:
KATUN2017072204600MÄNTSÄLÄ MÄNTSÄLÄ Venlanpolku 2 2 - 4a 2 - 4b505Mäntsälä Mäntsälä ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^^ ^^^ ^^ ^^^ ^^ ^ ^ | | | | | | | | | | | || ||| || ||| || | -- Kunnan nimi ruotsiksi | | | | | | | | | | | || ||| || ||| || -- Kunnan nimi suomeksi | | | | | | | | | | | || ||| || ||| |-- Kunnan koodi | | | | | | | | | | | || ||| || ||| -- Kiinteistön jakokirjain 2 | | | | | | | | | | | || ||| || ||-- Kiinteistönumero 2 | | | | | | | | | | | || ||| || |-- Välimerkki | | | | | | | | | | | || ||| || -- Kiinteistön jakokirjain 1 | | | | | | | | | | | || ||| |-- Kiinteistönumero 1 | | | | | | | | | | | || ||| -- Kiinteistön jakokirjain 2 | | | | | | | | | | | || ||-- Kiinteistönumero 2 | | | | | | | | | | | || |-- Välimerkki | | | | | | | | | | | || -- Kiinteistön jakokirjain 1 | | | | | | | | | | | |-- Kiinteistönumero 1 | | | | | | | | | | | -- Kiinteistötietojen tyyppi | | | | | | | | | | -- Tyhjä | | | | | | | | | -- Tyhjä | | | | | | | | -- Kadun (paikan) nimi ruotsiksi | | | | | | | -- Kadun (paikan) nimi suomeksi | | | | | | -- Postinumeron nimen lyhenne ruotsiksi | | | | | -- Postinumeron nimen lyhenne suomeksi | | | | -- Postinumeron nimi ruotsiksi | | | -- Postinumeron nimi suomeksi | | -- Postinumero | -- Ajopäivämäärä -- Tietuetunnus
我试图尽可能缩短线条,因为结构可以有更多的字段。
像这样:
KATUN2017072204600MÄNTSÄLÄ MÄNTSÄLÄ Venlanpolku 2 2 - 4a 2 - 4b505Mäntsälä Mäntsälä ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^^ ^^^ ^^ ^^^ ^^ ^ ^ | | | | | | | | | -- Tyhjä -- Tyhjä || ||| || ||| || | -- Kunnan nimi ruotsiksi | | | | | | | | -- Kadun (paikan) nimi ruotsiksi || ||| || ||| || -- Kunnan nimi suomeksi | | | | | | | -- Kadun (paikan) nimi suomeksi || ||| || ||| |-- Kunnan koodi | | | | | | -- Postinumeron nimen lyhenne ruotsiksi || ||| || ||| -- Kiinteistön jakokirjain 2 | | | | | -- Postinumeron nimen lyhenne suomeksi || ||| || ||-- Kiinteistönumero 2 | | | | -- Postinumeron nimi ruotsiksi || ||| || |-- Välimerkki | | | -- Postinumeron nimi suomeksi || ||| || -- Kiinteistön jakokirjain 1 | | -- Postinumero || ||| |-- Kiinteistönumero 1 | -- Ajopäivämäärä || ||| -- Kiinteistön jakokirjain 2 -- Tietuetunnus || ||-- Kiinteistönumero 2 || |-- Välimerkki || -- Kiinteistön jakokirjain 1 |-- Kiinteistönumero 1 -- Kiinteistötietojen tyyppi
这样我摆脱了额外的线条,而且更具可读性。如何实现这一目标?
我猜你必须总是试着去第一行并尝试拟合描述,如果它不合适,那么在说明适合之前先走一行。