调试功能,包含基于偏移的描述

时间:2017-07-23 06:04:20

标签: python

我正在解析基于偏移量的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

这样我摆脱了额外的线条,而且更具可读性。如何实现这一目标?

我猜你必须总是试着去第一行并尝试拟合描述,如果它不合适,那么在说明适合之前先走一行。

0 个答案:

没有答案