Debugging function with descriptions based on offsets

Viewed 44

I'm parsing offset-based ISO-8859-15 data. One entry per line. There's no documentation about the data and program crashes on random lines so I added debug function to see that offsets match and there's additional description field.

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

Example data:

KATUN2017072204600MÄNTSÄLÄ                      MÄNTSÄLÄ                                              Venlanpolku                                                                         2    2 -    4a    2 -    4b505Mäntsälä            Mäntsälä

This generates for example:

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

I'm trying to make the lines shorter when possible as the structure can have much more fields.

Like so:

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

This way I got rid of extra lines and it's more readable. How this can be achieved?

I'm guessing that you have to always try to go to the first line and try to fit the description and if it doesn't fit go one line lower until the description fits.

0 Answers
Related