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.