From f520c64052ab1c1f46b0a32fb47d794057afd9eb Mon Sep 17 00:00:00 2001 From: Lorenz Stechauner Date: Mon, 28 Nov 2022 10:22:57 +0100 Subject: [PATCH] Update plz.py and add view.sql --- data/plz.py | 14 +++++++++++--- sql/view.sql | 13 +++++++++++++ 2 files changed, 24 insertions(+), 3 deletions(-) create mode 100644 sql/view.sql diff --git a/data/plz.py b/data/plz.py index df25e3a..bd51c3e 100755 --- a/data/plz.py +++ b/data/plz.py @@ -6,6 +6,7 @@ import requests import re import xlrd import tempfile +import os URL = 'https://www.post.at/g/c/postlexikon' @@ -25,20 +26,27 @@ def get_excel_url() -> str: def download_excel() -> List[Tuple[int, str, int, str, int, str]]: - with tempfile.NamedTemporaryFile() as f: + f_name = None + try: + f = tempfile.NamedTemporaryFile(delete=False) with requests.get(get_excel_url(), stream=True) as r: if r.status_code != 200: raise RuntimeError(f'Unexpected response: {r.status_code} {r.reason}') for chunk in r.iter_content(chunk_size=8192): f.write(chunk) + f_name = f.name + f.close() rows = [] - wb = xlrd.open_workbook(f.name) + wb = xlrd.open_workbook(f_name) sheet = wb.sheet_by_index(0) for r in range(1, sheet.nrows): row = sheet.row_values(r) rows.append((int(row[0]), row[1], int(row[2]), row[3], int(row[4]), row[5])) return rows + finally: + if f_name is not None: + os.remove(f_name) def write_sql(data: List[Tuple[int, str, int, str, int, str]]) -> None: @@ -56,7 +64,7 @@ def write_sql(data: List[Tuple[int, str, int, str, int, str]]) -> None: f.write(b"INSERT INTO AT_ort VALUES\n") for okz, (name, gkz) in orte.items(): - f.write(f"({okz:5}, {gkz}, '{name}'),\n".encode('utf8')) + f.write(f"({okz:5}, {gkz}, '{name.replace(',', ', ').replace('.Bez.:', '. Bez.: ')}'),\n".encode('utf8')) f.seek(-2, 1) f.write(b';\n\n') diff --git a/sql/view.sql b/sql/view.sql new file mode 100644 index 0000000..f25e30a --- /dev/null +++ b/sql/view.sql @@ -0,0 +1,13 @@ + +CREATE VIEW v_plz AS +SELECT plz, o.name AS ort, g.name AS gemeinde, p.name AS bestimmungsort +FROM AT_gemeinde g + JOIN AT_ort o ON o.gkz = g.gkz + JOIN AT_plz p ON p.okz = o.okz; + +CREATE VIEW v_plz_wg AS +SELECT plz, o.name AS ort, g.name AS gemeinde, p.name AS bestimmungsort +FROM AT_gemeinde g + JOIN AT_ort o ON o.gkz = g.gkz + JOIN AT_plz p ON p.okz = o.okz +WHERE (g.gkz / 100) IN (308, 316, 310, 312, 321);