diff --git a/data/gemeinden.py b/data/gemeinden.py index 1cbdfc2..a88ef9e 100755 --- a/data/gemeinden.py +++ b/data/gemeinden.py @@ -9,7 +9,7 @@ import zipfile import PyPDF2 -GEM = re.compile(r'^([1-9][0-9]{2} [0-9]{2}) X') +GEM = re.compile(r'^([1-9][0-9]{2} [0-9]{2}) [X0-9]+') ORT = re.compile(r'^([0-9]{5}) (([A-Za-zÄÖÜäöü(][A-Za-z0-9äöüÄÖÜßẞ():,.-]* ?|[0-9]+\..*?)+) ?' r'([()X0-9.]+ [()X0-9.]+ ?|$)') STRIP_NUM = re.compile(r'[X0-9. -]+$') @@ -48,6 +48,10 @@ WIEN_UMGEBUNG = { } GEMEINDEN = { + # Tirol + 70330: 70370, + 70327: 70370, + 70341: 70370, # Oberösterreich 40803: 40835, 40819: 40835, @@ -55,6 +59,13 @@ GEMEINDEN = { 41330: 41344, 41519: 41344, 41625: 41628, + 41301: 41346, + 41303: 41343, + 41310: 41345, + 41335: 41346, + 41339: 41343, + 41340: 41628, + 41520: 41522, # Steiermark 60204: 62139, 60207: 62142, @@ -200,6 +211,223 @@ GEMEINDEN = { 60739: 62266, 60644: 60669, 60409: 62314, + 61511: 62383, + 61513: 62376, + 61515: 62377, + 61519: 62380, + 61603: 61630, + 61605: 61632, + 61606: 61631, + 61608: 61630, + 61610: 61630, + 61614: 61627, + 61616: 61629, + 61617: 61626, + 61619: 61632, + 61622: 61633, + 61623: 61628, + 61705: 61757, + 61707: 61756, + 61714: 61757, + 61715: 61761, + 61717: 61757, + 61718: 62266, + 61725: 61760, + 61726: 61760, + 61732: 61756, + 61733: 61763, + 61735: 61759, + 61736: 61763, + 61739: 61762, + 61742: 61764, + 61749: 61761, + 60201: 62138, + 60202: 62138, + 60205: 62147, + 60206: 62146, + 60208: 62142, + 60212: 62140, + 60214: 62147, + 60218: 62142, + 60221: 62135, + 60303: 60345, + 60306: 60344, + 60308: 60349, + 60311: 60349, + 60314: 60348, + 60316: 60344, + 60319: 60351, + 60321: 60344, + 60328: 60345, + 60332: 60345, + 60335: 60350, + 60340: 60351, + 60342: 60351, + 60402: 62380, + 60404: 62375, + 60406: 62386, + 60408: 62385, + 60412: 62382, + 60413: 62385, + 60414: 62387, + 60415: 62389, + 60418: 62379, + 60419: 62380, + 60423: 62378, + 60428: 62386, + 60429: 62390, + 60431: 62386, + 60432: 62380, + 60433: 62375, + 60434: 61057, + 60436: 62382, + 60437: 62382, + 60439: 62384, + 60440: 62378, + 60441: 60668, + 60443: 62380, + 60444: 62379, + 60445: 62380, + 60450: 61057, + 60452: 62382, + 60453: 62375, + 60454: 62380, + 60455: 62372, + 60456: 62381, + 60503: 62206, + 60513: 62273, + 60604: 60660, + 60605: 60666, + 60609: 60662, + 60612: 60667, + 60615: 60659, + 60616: 60664, + 60621: 60661, + 60630: 60662, + 60633: 60669, + 60635: 60667, + 60636: 60663, + 60640: 60668, + 60649: 61758, + 60650: 61758, + 60657: 60670, + 60701: 62266, + 60704: 62272, + 60709: 62270, + 60713: 62272, + 60714: 62266, + 60716: 62277, + 60718: 62274, + 60719: 62279, + 60720: 62274, + 60721: 62233, + 60724: 62278, + 60725: 62275, + 60727: 62276, + 60728: 62277, + 60730: 62242, + 60731: 62266, + 60733: 62245, + 60737: 62265, + 60740: 62266, + 60742: 62268, + 60743: 62256, + 60744: 62270, + 60745: 62278, + 60746: 62278, + 60747: 62279, + 60749: 62262, + 60802: 62044, + 60805: 62010, + 60807: 62042, + 60808: 62042, + 60811: 62043, + 60812: 62040, + 60813: 62044, + 60815: 62021, + 60816: 62040, + 60817: 62048, + 60818: 62026, + 60819: 62044, + 60820: 62044, + 60823: 62048, + 60901: 62041, + 60903: 62047, + 60904: 62008, + 60905: 62039, + 60906: 62039, + 60908: 62014, + 60909: 62046, + 60912: 62046, + 60913: 62034, + 61003: 61049, + 61005: 61049, + 61006: 61054, + 61010: 61054, + 61014: 61057, + 61018: 61053, + 61023: 61054, + 61025: 61061, + 61026: 61051, + 61029: 61049, + 61031: 61055, + 61035: 61052, + 61037: 61054, + 61038: 61053, + 61039: 61061, + 61042: 61050, + 61044: 61061, + 61102: 61120, + 61103: 61120, + 61202: 61254, + 61208: 61257, + 61209: 61257, + 61210: 61256, + 61212: 61254, + 61214: 61266, + 61216: 61253, + 61219: 61253, + 61220: 61266, + 61221: 61258, + 61224: 61260, + 61227: 61262, + 61229: 61263, + 61230: 61258, + 61232: 61265, + 61234: 61260, + 61239: 61264, + 61241: 61266, + 61245: 61255, + 61246: 61256, + 61248: 61264, + 61249: 61259, + 61250: 61253, + 61304: 62144, + 61309: 62141, + 61310: 62144, + 61401: 61439, + 61402: 61442, + 61403: 61446, + 61404: 61437, + 61405: 61437, + 61406: 61437, + 61407: 61439, + 61408: 61438, + 61412: 61439, + 61414: 61440, + 61415: 61440, + 61416: 61439, + 61418: 61441, + 61419: 61441, + 61420: 61443, + 61422: 61443, + 61426: 61442, + 61427: 61444, + 61430: 61445, + 61431: 61438, + 61433: 61438, + 61434: 61440, + 61435: 61439, } KgvRow = Tuple[int, str, int, str] @@ -273,16 +501,20 @@ def download_ov_land(bundesland: str) -> List[OvRow]: if not valid: continue - with open(f'out/{bundesland}.{page_num}.txt', 'w+') as o: + with open(f'out/{bundesland}.{page_num + 1}.txt', 'w+') as o: o.write(text) lines = text.splitlines() + cont = False for line in lines: m1 = ORT.match(line) m2 = GEM.match(line) if last is not None: - if m1 is None: + if line == 'Gemeindename': + cont = True + break + elif m1 is None: last = f'{last} {line}' val = STRIP_NUM.sub('', ORT.match(last).group(0)) okz = int(val[:5]) @@ -323,6 +555,8 @@ def download_ov_land(bundesland: str) -> List[OvRow]: elif gkz in GEMEINDEN: # Gemeindereformen (OÖ, Stmk.) gkz = GEMEINDEN[gkz] + if cont: + continue return rows @@ -357,30 +591,46 @@ def write_sql(kgv_rows: List[KgvRow], ov_rows: List[OvRow]) -> None: for gkz, okz, name in ov_rows: kgnr_o = None + if name.startswith('Wien '): + name = name.replace('Wien ', 'Wien, ').replace('.', '. ') + elif name.startswith('Graz,'): + name = name.replace('Graz,', 'Graz, ').replace('.Bez.:', '. Bezirk: ').replace('0', '') + if gkz not in gemeinden: pr.add(gkz) continue - for kgnr in gemeinden[gkz][1]: - if kgv[kgnr][0] in name or name in kgv[kgnr][0]: - kgnr_o = kgnr + if len(gemeinden[gkz][1]) == 1: + kgnr_o = gemeinden[gkz][1][0] + else: + for kgnr in gemeinden[gkz][1]: + n11 = name.lower().replace('-', '').replace('th', 't') + n12 = name.lower().replace('-', ' ').replace('th', 't') + n21 = kgv[kgnr][0].lower().replace('-', '').replace('th', 't') + n22 = kgv[kgnr][0].lower().replace('-', ' ').replace('th', 't') + if n11 in n21 or n11 in n22 or n12 in n21 or n12 in n22 or n21 in n11 or n21 in n12 or n22 in n11 or n22 in n12: + kgnr_o = kgnr - f.write(f"({okz:5}, {kgnr_o if kgnr_o is not None else 'NULL':5}, '{name}'),\n".encode('utf8')) + f.write(f"({okz:5}, {gkz:5}, {kgnr_o if kgnr_o is not None else 'NULL':>5}, '{name}'),\n".encode('utf8')) f.seek(-2, 1) f.write(b';\n') p = set() for e in pr: - possible = filter(lambda a: 60000 <= a[2] < 70000, kgv_rows.copy()) - for name in GKZ[e]: - if name == '': - continue - possible = filter(lambda a: a[1] == name, possible) + possible = filter(lambda a: a[2] // 10000 == e // 10000, kgv_rows.copy()) + if e in GKZ: + for name in GKZ[e]: + if name == '': + continue + possible = filter(lambda a: a[1] == name, possible) possible = list(possible) if len(possible) == 1: print(f' {e}: {possible[0][2]},') p.add(e) - print(pr - p) + + u = list(pr - p) + u.sort() + print(u) if __name__ == '__main__':