CSV zerlegen

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
Feedback1000
User
Beiträge: 88
Registriert: Dienstag 20. September 2022, 21:21

Hallo.
Ich habe zwar eine Lösung die funktioniert, aber zufrieden bin ich noch nicht - u. A. mit den folgenden zwei Dingen:
  1. dass ich im try-except-Bereich last_dict['attributes'] = [] 2-mal aufrufen muss und
  2. dass ich nicht verstehe, warum def trim_row(row) bei den AT-Zeilen nicht funktioniert, wie ich das gern hätte (es sind mehr DELIMITER in den AT-Zeilen, als Spaltennamen)
Vielleicht könntz ihr mich ein paar Tipps geben, wie ich den Code verbessern könnte.

Danke


Mein Code:

Code: Alles auswählen

import csv
from pprint import pprint

DELIMITER_CSV = ';'

csv_sections = {
    'Attribut': {
        'object_type': 'AT',
    },
    'Punkt': {
        'object_type': 'PT',
    },
    '2-Punktsymbol': {
        'object_type': 'SY',
    },
    '3-Punktsymbol': {
        'object_type': 'SY',
    },
    'Fläche': {
        'object_type': 'FL',
    },
    'Linienzug': {
        'object_type': 'PL',
    },
    'Text': {
        'object_type': 'TX',
    },
}
AT = csv_sections['Attribut']['object_type']

csv_object_type = [section['object_type'] for section in csv_sections.values()]


# print(csv_object_type)


# entfernt leere Einträge
def trim_row(row):
    return {k: v for k, v in row.items() if v != ''}


current_used_csv = []
with open('TEST.csv', mode='r') as csv_datei:
    csv_reader = csv.DictReader(csv_datei, delimiter=DELIMITER_CSV)
    header = csv_reader.fieldnames

    for line_number, row in enumerate(csv_reader, start=1):  # Zeilennummer hinzufügen
        if not row[header[0]]:  # Prüfen, ob der erste Eintrag leer ist
            break
        if row['Objektart'] not in csv_object_type:  # Überprüfung auf Fehler
            raise ValueError(
                f'Unbekannte Objektart in Zeile {line_number}: {row["Objektart"]} (erwartet wird {csv_object_type})')
        if row['Objektart'] == AT:
            last_dict = current_used_csv[-1]
            try:
                last_dict['attributes'].append(trim_row(row))
            except:
                last_dict['attributes'] = []
                last_dict['attributes'].append(trim_row(row))
            continue
        trimmed_row = trim_row(row)
        current_used_csv.append(trimmed_row)

pprint(current_used_csv, sort_dicts=False)
print(f'Anzahl der ausgelesenen Objekte: {len(current_used_csv)} (bis Zeile {line_number})')
Die CSV:
Objektart;Messcode;Bemerkung;Objekttyp;Beschreibung;Blockname;Layer;Kurzcode;Gruppe;Wert-ID;Wert-Spalte;Wert-Pos;Wert-Necessary;Wert-UebTab;Wert-Faktor;AT-Name;AT-Default;Ausrichtung;SY-Art;SY-InsertMode;XSize;YSize;XSizeMin;XSizeMax;YSizeMin;YSizeMax;XSize-ID;XSize-Pos;YSize-ID;YSize-Pos;SY-ZusObj;SY-EinsetzPkt;SY-RiCode;PosRechts;PosHoch;Massband-Pos
PT;XXXX;;Punkt 1;Punkt 1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
AT;;;;;;;;;Attribut A;;1;;;;Attribut A;;;;;;;;;;;;;;;;;;;;;;;;;
AT;;;;;;;;;Attribut B;;2;;;;Attribut B;;;;;;;;;;;;;;;;;;;;;;;;;
SY;XXXX;;2-Punktsymbol 1;2-Punktsymbol 1;;;;;;;;;;;;;;2;;;;;;;;;;;;;;;;;
AT;;;;;;;;;Attribut 2A;;1;;;;Attribut 2A;;;;;;;;;;;;;;;;;;;;;;;;;
AT;;;;;;;;;Attribut 2B;;2;;;;Attribut 2B;;;;;;;;;;;;;;;;;;;;;;;;;
AT;;;;;;;;;Attribut 2C;;3;;;;Attribut 2C;;;;;;;;;;;;;;;;;;;;;;;;;
SY;XXXX;;3-Punktsymbol 1;3-Punktsymbol 1;;;;;;;;;;;;;;3;;;;;;;;;;;;;;;;;
AT;;;;;;;;;Attribut 3A;;1;;;;Attribut 3A;;;;;;;;;;;;;;;;;;;;;;;;;
AT;;;;;;;;;Attribut 3B;;2;;;;Attribut 3B;;;;;;;;;;;;;;;;;;;;;;;;;
PL;XXXX;;Linienzug 1;Linienzug 1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
AT;;;;;;;;;Attribut LZ A;;1;;;;Attribut LZ A;;;;;;;;;;;;;;;;;;;;;;;;;
AT;;;;;;;;;Attribut LZ B;;2;;;;Attribut LZ B;;;;;;;;;;;;;;;;;;;;;;;;;
AT;;;;;;;;;Attribut LZ C;;3;;;;Attribut LZ C;;;;;;;;;;;;;;;;;;;;;;;;;
AT;;;;;;;;;Attribut LZ D;;4;;;;Attribut LZ D;;;;;;;;;;;;;;;;;;;;;;;;;
TX;XXXX;;Text 1;Text 1;;;;;Text;;1;;;;;;;;;;;;;;;;;;;;;;0;0;
AT;;;;;;;;;Attribut T A;;1;;;;Attribut T A;;;;;;;;;;;;;;;;;;;;;;;;;
AT;;;;;;;;;Attribut T B;;2;;;;Attribut T B;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;
LI-DEF;99;;LinieAnfang;;;;;;;;;
LI-DEF;9;;LinieEnde;;;;;;;;;
LI-DEF;-;;LinieEndeVorMC;;;;;;;;;
LI-DEF;-;;LinieEndeVorGeometrieCode;;;;;;;;;
LI-DEF;1;;LinieSchliessen;;;;;;;;;
LI-DEF;2;;LinieUebergang;;;;;;;;;
LI-DEF;55;;AusrundenStart;;;;;;;;;
LI-DEF;56;;AusrundenEnde;;;;;;;;;
LI-DEF;22;;Umdrehen;;;;;;;;;
LI-DEF;33;;FluchtPkt;;;;;;;;;
LI-DEF;3;;FluchtPktMitAbst;;;;;;;;;
LI-DEF;4;;Bogen;;;;;;;;;
LI-DEF;5;;Tangentenbogen;;;;;;;;;
LI-DEF;6;;Kreis;;;;;;;;;
LI-DEF;7;;Rechteck;;;;;;;;;
LI-DEF;8;;Parallelogramm;;;;;;;;;
LI-DEF;11;;BreitenPkt;;;;;;;;;
LI-DEF;44;;ReWinkelLinks;;;;;;;;;
LI-DEF;66;;ReWinkelRechts;;;;;;;;;
LI-DEF;0;;Massbandkodierung;;;;;;;;;;;0.001
LI-DEF;gn;;Gruppierung;;;;;;;;;
LI-DEF;gn3;;Gruppierung3Linien;;;;;;;;;
;;;;;;
MASSBAND-DEF;-;;Links;;;;;;;;;
MASSBAND-DEF;V;;Vorne;;;;;;;;;
MASSBAND-DEF;+;;Rechts;;;;;;;;;
MASSBAND-DEF;Z;;Zurueck;;;;;;;;;
MASSBAND-DEF;B;;Beenden;;;;;;;;;
MASSBAND-DEF;S;;Schliessen;;;;;;;;;
;;;;;;
SY-DEF;-;;SymbolUmkehrung;;;;;;;;;
SY-DEF;9;;SymbolUmkehrungGeometrieCode;;;;;;;;;
;;;;;;
MESSREIHENFOLGE-DEF;999;;Start;;;;;;;;;
MESSREIHENFOLGE-DEF;-999;;Ende;;;;;;;;;
MESSREIHENFOLGE-DEF;998;;Auslassen;;;;;;;;;
MESSREIHENFOLGE-DEF;997;;Fuellcode;;;;;;;;;
MESSREIHENFOLGE-DEF;996;;Hinzufuegen;;;;;;;;;
MESSREIHENFOLGE-DEF;995;;Ignorieren;;;;;;;;;
derElch
User
Beiträge: 33
Registriert: Sonntag 25. Februar 2018, 13:14

Meine Gedanken:

Wieso bei csv_section noch den Untertyp "object_type" obwohl du ihn im weiteren Verlauf nicht nutzt?
Die for-Schleife kann man aus dem with-Block rausnehmen.
Das abfangen vom AT gefällt mir nicht, ob es eleganter geht?

Code: Alles auswählen

for line_number, row in enumerate(csv_reader, start=1):  # Zeilennummer hinzufügen
    if not row[header[0]]:  # Prüfen, ob der erste Eintrag leer ist
        break
    if row['Objektart'] not in csv_object_type:  # Überprüfung auf Fehler
        raise ValueError(
            f'Unbekannte Objektart in Zeile {line_number}: {row["Objektart"]} (erwartet wird {csv_object_type})')
    if row['Objektart'] != csv_sections['Attribut']:
        continue
    current_used_csv.append(trim_row(row))
Ungetestet!
Benutzeravatar
__blackjack__
User
Beiträge: 13268
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@Feedback1000: In der `csv_sections`-Struktur sind die Wörterbücher die alle nur ein Schlüssel/Wert-Paar enthalten wobei der Schlüssel auch noch überall den gleichen Wert hat, nicht so sinnvoll. Im Grunde werden die Schlüssel von dem äusseren Wörterbuch gar nicht wirklich verwendet.

Bei CSV-Dateien muss man das `newline`-Argument angeben (siehe Doku zum `csv`-Modul) und bei Textdateien sollte man immer explizit die Kodierung angeben.

``continue`` ist ein unbedingter Sprung der nicht an der Einrückung ablesbar ist. Ausserdem macht das gerne mal Probleme wenn man Code erweitern und/oder in eigene Funktionen heraus ziehen möchte. Und es ist in der Regel trivial vermeidbar, so auch in diesem Fall.

Keine nackten ``except:`` ohne konkrete Ausnahme(n). Hier wird *alles* so behandelt als wäre es ein `KeyError`, selbst wenn man sich im ``try``-Block bei einem Namen vertippt.

In jedem der Fälle die da eintreten können wird `trim_row()` aufgerufen. Das sollte man nur an einer Stelle aufrufen.

Der Code berücksichtigt den Fall nicht, dass die Datei keine Datensätze enthält. Dann endet das in einem `NameError` weil `line_number` dann nicht definiert ist, aber versucht wird die auszugeben.

Zwischenstand (ungetestet):

Code: Alles auswählen

import csv
from pprint import pprint

CSV_DELIMITER = ";"

SECTION_NAME_TO_TYPE_CODE = {
    "Attribut": "AT",
    "Punkt": "PT",
    "2-Punktsymbol": "SY",
    "3-Punktsymbol": "SY",
    "Fläche": "FL",
    "Linienzug": "PL",
    "Text": "TX",
}

ATTRIBUTE_TYPE_CODE = SECTION_NAME_TO_TYPE_CODE["Attribut"]
OBJECT_TYPE_CODES = set(SECTION_NAME_TO_TYPE_CODE.values())


def trim_row(row):
    return {key: value for key, value in row.items() if value != ""}


def main():
    objects = []
    with open("TEST.csv", newline="", encoding="ascii") as csv_datei:
        csv_reader = csv.DictReader(csv_datei, delimiter=CSV_DELIMITER)
        header = csv_reader.fieldnames
        row_number = 0
        for row_number, row in enumerate(csv_reader, start=1):
            if not row[header[0]]:
                break

            if row["Objektart"] not in OBJECT_TYPE_CODES:
                raise ValueError(
                    f'Unbekannte Objektart in Zeile {row_number}:'
                    f' {row["Objektart"]!r} (erwartet wird {OBJECT_TYPE_CODES})'
                )
            
            row = trim_row(row)
            if row["Objektart"] == ATTRIBUTE_TYPE_CODE:
                objects[-1].setdefault("attributes", []).append(row)
            else:
                objects.append(row)

    pprint(objects, sort_dicts=False)
    print(
        f"Anzahl der ausgelesenen Objekte: {len(objects)}"
        f" (bis Zeile {row_number})"
    )


if __name__ == "__main__":
    main()
Was ich an der Datenstruktur, die da als Ergebnis heraus kommt, noch unschön finde, ist das es "attributes" nur gibt falls es tatsächlich AT-Datensätze gab. Das bedeutet für die Weiterverarbeitung, dass man immer auf die Existenz davon prüfen muss, wenn man darauf zugreifen will. Also im Grunde ja das Problem das Du jetzt schon hast.
Please call it what it is: copyright infringement, not piracy. Piracy takes place in international waters, and involves one or more of theft, murder, rape and kidnapping. Making an unauthorized copy of a piece of software is not piracy, it is an infringement of a government-granted monopoly.
Feedback1000
User
Beiträge: 88
Registriert: Dienstag 20. September 2022, 21:21

@__blackjack__ Danke für deine Hilfe. Habe nun noch zusätzlich versucht, deines Hinweises bezüglich Vorhandenseins von 'attributes' zu behandeln, scheitere jetzt aber an einem "IndexError: list index out of range". Hast du nen Tipp für mich, wo ich das Brett vorm Kopf eingebaut habe?
Hier mein von dir leicht geänderter Code:

Code: Alles auswählen

import csv
from pprint import pprint

CSV_DELIMITER = ';'

SECTION_NAME_TO_TYPE_CODE = {
    'Attribut': 'AT',
    'Punkt': 'PT',
    '2-Punktsymbol': 'SY',
    '3-Punktsymbol': 'SY',
    'Fläche': 'FL',
    'Linienzug': 'PL',
    'Text': 'TX',
}

ATTRIBUTE_TYPE_CODE = SECTION_NAME_TO_TYPE_CODE['Attribut']
OBJECT_TYPE_CODES = set(SECTION_NAME_TO_TYPE_CODE.values())


def trim_row(row):
    return {key: value for key, value in row.items() if value != ''}


def main():
    csv_objects = []
    with open('TEST.csv', newline='', encoding='ascii') as csv_datei:
        csv_reader = csv.DictReader(csv_datei, delimiter=CSV_DELIMITER)
        header = csv_reader.fieldnames
        row_number = 0
        for row_number, row in enumerate(csv_reader, start=1):
            if not row[header[0]]:
                break

            if row['Objektart'] not in OBJECT_TYPE_CODES:
                raise ValueError(
                    f'Unbekannte Objektart in Zeile {row_number}:'
                    f' {row["Objektart"]!r} (erwartet wird {OBJECT_TYPE_CODES})'
                )

            row = trim_row(row)

            if 'attributes' not in csv_objects[-1]:
                csv_objects[-1]['attributes'] = []
            if row['Objektart'] == ATTRIBUTE_TYPE_CODE:
                csv_objects[-1]['attributes'].append(row)
                # csv_objects[-1].setdefault('attributes', []).append(row)
            else:
                csv_objects.append(row)

    pprint(csv_objects, sort_dicts=False)
    print(
        f'Anzahl der ausgelesenen Objekte: {len(csv_objects)}'
        f' (bis Zeile {row_number})'
    )


if __name__ == '__main__':
    main()
Benutzeravatar
Dennis89
User
Beiträge: 1226
Registriert: Freitag 11. Dezember 2020, 15:13

Hallo,

bekommst du die Meldung, bezogen auf "csv_objects"?
Die Liste ist leer und auf eine leere Liste kannst du nicht auf den Index "-1" zugreifen. (falls ich das richtig gesehen habe)

Es hilft immer, wenn du die vollständige Fehlermeldung mit in deinen Post kopierst.

Grüße
Dennis
"When I got the music, I got a place to go" [Rancid, 1993]
Feedback1000
User
Beiträge: 88
Registriert: Dienstag 20. September 2022, 21:21

Hallo.

Ja, es bezieht sich auf csv_object. Und nach deinem zarten Hinweis verstehe ich auch, was das Problem ist bzw. war.

Hier erst einmal die gesamte Fehlermeldung vor meiner untenstehenden Änderung:
Traceback (most recent call last):
File "C:\Users\Fabsi\PycharmProjects\Geomax-Import\CSV_Vorbereitung.py", line 59, in <module>
main()
File "C:\Users\Fabsi\PycharmProjects\Geomax-Import\CSV_Vorbereitung.py", line 42, in main
if 'attributes' not in csv_objects[-1]:
~~~~~~~~~~~^^^^
IndexError: list index out of range
Hier meine Lösung:

Code: Alles auswählen

import csv
from pprint import pprint

CSV_DELIMITER = ';'

CSV_SECTION_NAME_TO_TYPE_CODE = {
    'Attribut': 'AT',
    'Punkt': 'PT',
    '2-Punktsymbol': 'SY',
    '3-Punktsymbol': 'SY',
    'Fläche': 'FL',
    'Linienzug': 'PL',
    'Text': 'TX',
}

CSV_ATTRIBUTE_TYPE_CODE = CSV_SECTION_NAME_TO_TYPE_CODE['Attribut']
CSV_OBJECT_TYPE_CODES = set(CSV_SECTION_NAME_TO_TYPE_CODE.values())


def trim_row(row):
    return {key: value for key, value in row.items() if value != ''}


def main():
    csv_objects = []
    with open('TEST.csv', newline='', encoding='ansi') as csv_datei:
        csv_reader = csv.DictReader(csv_datei, delimiter=CSV_DELIMITER)
        header = csv_reader.fieldnames
        row_number = 0
        for row_number, row in enumerate(csv_reader, start=1):
            if not row[header[0]]:
                break

            if row['Objektart'] not in CSV_OBJECT_TYPE_CODES:
                raise ValueError(
                    f'Unbekannte Objektart in Zeile {row_number + 1}:'
                    f' {row["Objektart"]!r} (erwartet wird {sorted(CSV_OBJECT_TYPE_CODES)})'
                )

            row = trim_row(row)

            if row['Objektart'] == CSV_ATTRIBUTE_TYPE_CODE:
                csv_objects[-1]['attributes'].append(row)
            else:
                row['attributes'] = []
                csv_objects.append(row)

    pprint(csv_objects, sort_dicts=False)
    print(
        f'Anzahl der ausgelesenen Objekte: {len(csv_objects)}'
        f' (bis Zeile {row_number})'
    )


if __name__ == '__main__':
    main()
Gibt das Sinn, oder habe ich einen weiteren Spezialfall vergessen?
Feedback1000
User
Beiträge: 88
Registriert: Dienstag 20. September 2022, 21:21

Noch anders:

habe nun das Ganze mal mit einer Nicht-TEST-Datei

Code: Alles auswählen

Objektart;Messcode;Bemerkung;Objekttyp;Beschreibung;Blockname;Layer;Kurzcode;Gruppe;Wert-ID;Wert-Spalte;Wert-Pos;Wert-Necessary;Wert-UebTab;Wert-Faktor;AT-Name;AT-Default;AT-Db;SY-Art;SY-InsertMode;XSize;YSize;XSizeMin;XSizeMax;YSizeMin;YSizeMax;XSize-ID;XSize-Pos;YSize-ID;YSize-Pos;SY-ZusObj;SY-EinsetzPkt;SG-BreiteMin;SG-BreiteMax;Verdrehung;TX-Stil;TX-Hoehe;Ausrichtung;PosRechts;PosHoch;Komplex-Def;Komplex-Diff
PT;1;;Polygonpunkt;Polygonpunkt;vpallgem;Vermessung_Polygonpunkt;x;Vermessung;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
AT;;;;;;;;;Herkunft;;1;;;;Herkunft;;;;;;;;;;;;;;;;;;;;;;;;;;
PT;2;;Detailpunkt;Detailpunkt;Kreuz;Vermessung_Detailpunkt;x;Vermessung;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
AT;;;;;;;;;Herkunft;;1;;;;Herkunft;;;;;;;;;;;;;;;;;;;;;;;;;;
PT;3;;Detailpunkt (nicht Gelände);Detpkt.n.Gelände;Kreuz;Vermessung_Detailpunkt-(nicht-Gelände);x;Vermessung;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
AT;;;;;;;;;Herkunft;;1;;;;Herkunft;;;;;;;;;;;;;;;;;;;;;;;;;;
PT;4;;Detailpunkt (Fassade);Detpkt Fassade;Kreuz;Vermessung_Detailpunkt-(Fassade);x;Vermessung;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
AT;;;;;;;;;Herkunft;;1;;;;Herkunft;;;;;;;;;;;;;;;;;;;;;;;;;;
PT;5;;Geländepunkt;Geländepunkt;SYM402;Vermessung_Geländepunkt;x;Vermessung;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
AT;;;;;;;;;Herkunft;;1;;;;Herkunft;;;;;;;;;;;;;;;;;;;;;;;;;;
PT;6;;Standpunkt;Standpunkt;SYM004;Vermessung_Standpunkt;x;Vermessung;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
AT;;;;;;;;;Herkunft;;1;;;;Herkunft;;;;;;;;;;;;;;;;;;;;;;;;;;
PT;7;;Anschlusspunkt;Anschlusspunkt;SYM004;Vermessung_Anschlusspunkt;x;Vermessung;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
AT;;;;;;;;;Herkunft;;1;;;;Herkunft;;;;;;;;;;;;;;;;;;;;;;;;;;
PT;8;;Festpunkt;Festpunkt;SYM004;Vermessung_Festpunkt;x;Vermessung;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
AT;;;;;;;;;Herkunft;;1;;;;Herkunft;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
PT;21;;Mauer;Mauer;Kreuz;Bauwerke_Mauer_Punkt;x;Bauwerke;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
AT;;;;;;;;;Herkunft;;2;;;;Herkunft;;;;;;;;;;;;;;;;;;;;;;;;;;
PL;21;;Mauer;Mauer;;Bauwerke_Mauer;x;Bauwerke;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
AT;;;;;;;;;Breite;;1;;;0,001;Breite;;;;;;;;;;;;;;;;;;;;;;;;;;
AT;;;;;;;;;Herkunft;;2;;;;Herkunft;;;;;;;;;;;;;;;;;;;;;;;;;;
AT;;;;;;;;;Signaturabstand;;3;;;;Signaturabstand;;;;;;;;;;;;;;;;;;;;;;;;;;
PT;22;;Zaunmauer;Zaunmauer;Kreuz;Bauwerke_Zaunmauer_Punkt;x;Bauwerke;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
AT;;;;;;;;;Herkunft;;2;;;;Herkunft;;;;;;;;;;;;;;;;;;;;;;;;;;
PL;22;;Zaunmauer;Zaunmauer;;Bauwerke_Zaunmauer;x;Bauwerke;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
AT;;;;;;;;;Breite;;1;;;0,001;Breite;;;;;;;;;;;;;;;;;;;;;;;;;;
AT;;;;;;;;;Herkunft;;2;;;;Herkunft;;;;;;;;;;;;;;;;;;;;;;;;;;
AT;;;;;;;;;Signaturabstand;;3;;;;Signaturabstand;;;;;;;;;;;;;;;;;;;;;;;;;;
PT;23;;Zaun;Zaun;Kreuz;Bauwerke_Zaun_Punkt;x;Bauwerke;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
AT;;;;;;;;;Herkunft;;1;;;;Herkunft;;;;;;;;;;;;;;;;;;;;;;;;;;
PL;23;;Zaun;Zaun;;Bauwerke_Zaun;x;Bauwerke;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
AT;;;;;;;;;Herkunft;;1;;;;Herkunft;;;;;;;;;;;;;;;;;;;;;;;;;;
AT;;;;;;;;;Signaturabstand;;2;;;;Signaturabstand;;;;;;;;;;;;;;;;;;;;;;;;;;
AT;;;;;;;;;Breite;;3;;;;Breite;;;;;;;;;;;;;;;;;;;;;;;;;;
PT;24;;Detailpunkt;Detailpunkt;Kreuz;Vermessung_Detailpunkt;x;Vermessung;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
AT;;;;;;;;;Herkunft;;1;;;;Herkunft;;;;;;;;;;;;;;;;;;;;;;;;;;
SY;24;;EingangEinfriedung;EingangEinfri 2P;B40;Bauwerke_EingangEinfriedung;x;Bauwerke;;;;;;0,001;;;;2;0;1;1;;;;;;;;;;;;;;;;;;;;
AT;;;;;;;;;Herkunft;;1;;;;Herkunft;;;;;;;;;;;;;;;;;;;;;;;;;;
PT;25;;Detailpunkt;Detailpunkt;Kreuz;Vermessung_Detailpunkt;x;Vermessung;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
AT;;;;;;;;;Herkunft;;1;;;;Herkunft;;;;;;;;;;;;;;;;;;;;;;;;;;
SY;25;;Einfahrt;Einfahrt 2P;B40;Bauwerke_Einfahrt;x;Bauwerke;;;;;;0,001;;;;2;0;1;1;;;;;;;;;;;;;;;;;;;;
AT;;;;;;;;;Herkunft;;1;;;;Herkunft;;;;;;;;;;;;;;;;;;;;;;;;;;
PT;26;;Hauptgebäude;Hauptgebäude;Kreuz;Bauwerke_Hauptgebäude_<Geschoss>_Punkt;x;Bauwerke;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
AT;;;;;;;;;Geschoss;;1;;;;Geschoss;;;;;;;;;;;;;;;;;;;;;;;;;;
AT;;;;;;;;;Herkunft;;2;;;;Herkunft;;;;;;;;;;;;;;;;;;;;;;;;;;
PL;26;;Hauptgebäude;Hauptgebäude;;Bauwerke_Hauptgebäude_<Geschoss>;x;Bauwerke;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
AT;;;;;;;;;Geschoss;;1;;;;Geschoss;;;;;;;;;;;;;;;;;;;;;;;;;;
AT;;;;;;;;;Herkunft;;2;;;;Herkunft;;;;;;;;;;;;;;;;;;;;;;;;;;
PT;27;;Nebengebäude;Nebengebäude;Kreuz;Bauwerke_Nebengebäude_<Geschoss>_Punkt;x;Bauwerke;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
AT;;;;;;;;;Geschoss;;1;;;;Geschoss;;;;;;;;;;;;;;;;;;;;;;;;;;
AT;;;;;;;;;Herkunft;;2;;;;Herkunft;;;;;;;;;;;;;;;;;;;;;;;;;;
PL;27;;Nebengebäude;Nebengebäude;;Bauwerke_Nebengebäude_<Geschoss>;x;Bauwerke;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
AT;;;;;;;;;Geschoss;;1;;;;Geschoss;;;;;;;;;;;;;;;;;;;;;;;;;;
AT;;;;;;;;;Herkunft;;2;;;;Herkunft;;;;;;;;;;;;;;;;;;;;;;;;;;
PT;28;;Garage;Garage;Kreuz;Bauwerke_Garage_Punkt;x;Bauwerke;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
AT;;;;;;;;;Herkunft;;1;;;;Herkunft;;;;;;;;;;;;;;;;;;;;;;;;;;
PL;28;;Garage;Garage;;Bauwerke_Garage;x;Bauwerke;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
AT;;;;;;;;;Herkunft;;1;;;;Herkunft;;;;;;;;;;;;;;;;;;;;;;;;;;
TX;29;;HausNummer;HausNummer;;Bauwerke_HausNummer;x;Bauwerke;Text;;1;;;;;;;;;;;;;;;;;;;;;;;;NORM_K;3,5;;1;2,5;;
PT;31;;Randstein;Randstein;Kreuz;Verkehr-Straße_Randstein_Punkt;x;Verkehr Straße;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
AT;;;;;;;;;Herkunft;;1;;;;Herkunft;;;;;;;;;;;;;;;;;;;;;;;;;;
PL;31;;Randstein;Randstein;;Verkehr-Straße_Randstein;x;Verkehr Straße;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
AT;;;;;;;;;Herkunft;;1;;;;Herkunft;;;;;;;;;;;;;;;;;;;;;;;;;;
AT;;;;;;;;;Breite;;2;;;;Breite;;;;;;;;;;;;;;;;;;;;;;;;;;
PT;32;;Fahrbahn;Fahrbahn;Kreuz;Verkehr-Straße_FahrVerkehr-Schiene_Punkt;x;Verkehr Straße;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
AT;;;;;;;;;Herkunft;;1;;;;Herkunft;;;;;;;;;;;;;;;;;;;;;;;;;;
PL;32;;Fahrbahn;Fahrbahn;;Verkehr-Straße_Fahrbahn;x;Verkehr Straße;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
AT;;;;;;;;;Herkunft;;1;;;;Herkunft;;;;;;;;;;;;;;;;;;;;;;;;;;
PT;33;;Fußweg;Fußweg;Kreuz;Verkehr-Straße_Fußweg_Punkt;x;Verkehr Straße;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
AT;;;;;;;;;Herkunft;;1;;;;Herkunft;;;;;;;;;;;;;;;;;;;;;;;;;;
PL;33;;Fußweg;Fußweg;;Verkehr-Straße_Fußweg;x;Verkehr Straße;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
AT;;;;;;;;;Herkunft;;1;;;;Herkunft;;;;;;;;;;;;;;;;;;;;;;;;;;
PT;34;;allgemeines Verkehrsschild;Verkehrsschild;VKSCHILD1;Verkehr-Straße_allgemeines-Verkehrsschild;x;Verkehr Straße;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
PT;35;;Ampel;Ampel;AMP;Verkehr-Straße_ampel;x;Verkehr Straße;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
PT;36;;Kilometermarke;Kilometermarke;KMST;Verkehr-Straße_Kilometermarke;x;Verkehr Straße;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
AT;;;;;;;;;Kilometer;;1;;;;Kilometerangabe;;;;;;;;;;;;;;;;;;;;;;;;;;
AT;;;;;;;;;Herkunft;;2;;;;Herkunft;;;;;;;;;;;;;;;;;;;;;;;;;;
PT;41;;Schiene;Schiene;Kreuz;Verkehr-Schiene_Schiene_Punkt;x;Verkehr Schiene;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
AT;;;;;;;;;Herkunft;;1;;;;Herkunft;;;;;;;;;;;;;;;;;;;;;;;;;;
PL;41;;Schiene;Schiene;;Verkehr-Schiene_Schiene;x;Verkehr Schiene;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
AT;;;;;;;;;Herkunft;;1;;;;Herkunft;;;;;;;;;;;;;;;;;;;;;;;;;;
PT;42;;Schwellen 144;Schwellen 144;Kreuz;Verkehr-Schiene_Schwellen-144_Punkt;x;Verkehr Schiene;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
AT;;;;;;;;;Herkunft;;1;;;;Herkunft;;;;;;;;;;;;;;;;;;;;;;;;;;
PL;42;;Schwellen 144;Schwellen 144;;Verkehr-Schiene_Schwellen-144;x;Verkehr Schiene;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
AT;;;;;;;;;Herkunft;;1;;;;Herkunft;;;;;;;;;;;;;;;;;;;;;;;;;;
AT;;;;;;;;;Seite;;2;;;;Seite;;;;;;;;;;;;;;;;;;;;;;;;;;
TX;43;;km-Beschriftung Bahn;km-Beschr Bahn;;Verkehr-Schine_km-Beschriftung-Bahn;x;Verkehr Schiene;Text;;1;;;;;;;;;;;;;;;;;;;;;;;;NORM_K;2,5;;1;2,5;;
PT;51;;Poller;Poller;1105;Verkehr-Straße_Poller;x;Verkehr Straße;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
AT;;;;;;;;;Herkunft;;1;;;;Herkunft;;;;;;;;;;;;;;;;;;;;;;;;;;
PT;52;;Denkmal;Denkmal;SYM305;Bauwerke_Denkmal;x;Bauwerke;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
AT;;;;;;;;;Herkunft;;1;;;;Herkunft;;;;;;;;;;;;;;;;;;;;;;;;;;
PT;61;;Hydrant oberirdisch;Hydrant oben;Hyoi;Wasserversorgung_Hydrant-oberirdisch;x;Wasserversorgung;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
AT;;;;;;;;;Herkunft;;1;;;;Herkunft;;;;;;;;;;;;;;;;;;;;;;;;;;
PT;62;;Hydrant unterirdisch;Hydrant unten;Hyui;Wasserversorgung_Hydrant-unterirdisch;x;Wasserversorgung;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
AT;;;;;;;;;Herkunft;;1;;;;Herkunft;;;;;;;;;;;;;;;;;;;;;;;;;;
PT;63;;Detailpunkt;Detailpunkt;Kreuz;Vermessung_Detailpunkt;x;Vermessung;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
AT;;;;;;;;;Herkunft;;1;;;;Herkunft;;;;;;;;;;;;;;;;;;;;;;;;;;
SY;63;;Deckel eckig (Diagonal) Wasserversorgung;Deckel e/d WV 2P;SCHACHTD2p;Wasserversorgung_Deckel;x;Wasserversorgung;;;;;;0,001;;;;2;;1;1;;;;;;;;;;;;;100;;;;;;;
AT;;;;;;;;;Herkunft;;1;;;;Herkunft;;;;;;;;;;;;;;;;;;;;;;;;;;
PT;64;;Detailpunkt;Detailpunkt;Kreuz;Vermessung_Detailpunkt;x;Vermessung;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
AT;;;;;;;;;Herkunft;;1;;;;Herkunft;;;;;;;;;;;;;;;;;;;;;;;;;;
SY;64;;Deckel rund (Mitte-Rand) Wasserversorgung;Deckel rund WV 2P;SchachtR2;Wasserversorgung_Deckel;x;Wasserversorgung;;;;;;0,001;;;;2;;1;1;;;;;;;;;;;;;100;;;;;;;
AT;;;;;;;;;Herkunft;;1;;;;Herkunft;;;;;;;;;;;;;;;;;;;;;;;;;;
PT;65;;Detailpunkt;Detailpunkt;Kreuz;Vermessung_Detailpunkt;x;Vermessung;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
AT;;;;;;;;;Herkunft;;2;;;;Herkunft;;;;;;;;;;;;;;;;;;;;;;;;;;
SY;65;;Deckel eckig (Diagonal) Wasserentsorgung;Deckel e/d WE 2P;SCHACHTD2p_Vent;Wasserentsorgung_Deckel;x;Wasserentsorgung;;;;;;0,001;;;;2;;1;1;;;;;;;;;;;;;100;;;;;;;
AT;;;;;;;;;Ventilation;;1;;Ventilation.tzu;;Ventilation;;;;;;;;;;;;;;;;;;;;;;;;;;
AT;;;;;;;;;Herkunft;;2;;;;Herkunft;;;;;;;;;;;;;;;;;;;;;;;;;;
PT;66;;Detailpunkt;Detailpunkt;Kreuz;Vermessung_Detailpunkt;x;Vermessung;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
AT;;;;;;;;;Herkunft;;2;;;;Herkunft;;;;;;;;;;;;;;;;;;;;;;;;;;
SY;66;;Deckel rund (Mitte-Rand) Wasserentsorgung;Deckel rund WE 2P;SchachtR2_Vent;Wasserentsorgung_Deckel;x;Wasserentsorgung;;;;;;0,001;;;;2;;1;1;;;;;;;;;;;;;100;;;;;;;
AT;;;;;;;;;Ventilation;;1;;Ventilation.tzu;;Ventilation;;;;;;;;;;;;;;;;;;;;;;;;;;
AT;;;;;;;;;Herkunft;;2;;;;Herkunft;;;;;;;;;;;;;;;;;;;;;;;;;;
PT;68;;Einfachmast Strom;Einfachmast Strom;SYSTR;Strom_Einfachmast;x;Strom;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
AT;;;;;;;;;Herkunft;;1;;;;Herkunft;;;;;;;;;;;;;;;;;;;;;;;;;;
PT;69;;Detailpunkt;Detailpunkt;Kreuz;Vermessung_Detailpunkt;x;Vermessung;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
AT;;;;;;;;;Herkunft;;1;;;;Herkunft;;;;;;;;;;;;;;;;;;;;;;;;;;
SY;69;;Schaltkasten (3 Punkte) Strom;Kasten Strom 3P;SCHALTKA;Strom_Schaltkasten;x;Strom;;;;;;0,001;;;;3;0;1;1;;;;;Breite;1;Breite;1;BLITZ;M;;;;;;;;;;
AT;;;;;;;;;Herkunft;;1;;;;Herkunft;;;;;;;;;;;;;;;;;;;;;;;;;;
PT;71;;Gasschieber;Gasschieber;SCHIEB;Gas_Schieber;x;Gas;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
AT;;;;;;;;;Herkunft;;1;;;;Herkunft;;;;;;;;;;;;;;;;;;;;;;;;;;
PT;72;;Fernmeldestein;Fernmeldestein;KAST;Fernmeldewesen_Fernmeldestein;x;Fernmeldewesen;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
AT;;;;;;;;;Herkunft;;1;;;;Herkunft;;;;;;;;;;;;;;;;;;;;;;;;;;
PT;73;;Einfachmast Fernmeldewesen;Einfachmast FM;SYFM;Fernmeldewesen_Einfachmast-Fernmeldewesen;x;Fernmeldewesen;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
AT;;;;;;;;;Herkunft;;1;;;;Herkunft;;;;;;;;;;;;;;;;;;;;;;;;;;
PT;74;;Detailpunkt;Detailpunkt;Kreuz;Vermessung_Detailpunkt;x;Vermessung;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
AT;;;;;;;;;Herkunft;;1;;;;Herkunft;;;;;;;;;;;;;;;;;;;;;;;;;;
SY;74;;Fernmeldezelle (3 Punkte);Fernmeldezelle 3P;SCHALTKA;Fernmeldewesen_Fernmeldezelle;x;Fernmeldewesen;;;;;;0,001;;;;3;0;1;1;;;;;Breite;1;Breite;1;;;;;;;;;;;;
AT;;;;;;;;;Herkunft;;1;;;;Herkunft;;;;;;;;;;;;;;;;;;;;;;;;;;
PT;75;;Detailpunkt;Detailpunkt;Kreuz;Vermessung_Detailpunkt;x;Vermessung;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
AT;;;;;;;;;Herkunft;;1;;;;Herkunft;;;;;;;;;;;;;;;;;;;;;;;;;;
SY;75;;Schaltkasten (3 Punkte) Fernmeldewesen;Kasten FM 3P;SCHALTKA;Fernmeldewesen_Schaltkasten;x;Fernmeldewesen;;;;;;0,001;;;;3;0;1;1;;;;;Breite;1;Breite;1;;;;;;;;;;;;
AT;;;;;;;;;Herkunft;;1;;;;Herkunft;;;;;;;;;;;;;;;;;;;;;;;;;;
PT;76;;Detailpunkt;Detailpunkt;Kreuz;Vermessung_Detailpunkt;x;Vermessung;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
AT;;;;;;;;;Herkunft;;1;;;;Herkunft;;;;;;;;;;;;;;;;;;;;;;;;;;
SY;76;;KabelTV-Kasten (3 Punkte);KabelTV-Kasten 3P;SCHALTKA;Fernmeldewesen_KabelTV-Kasten;x;Fernmeldewesen;;;;;;0,001;;;;3;0;1;1;;;;;Breite;1;Breite;1;;;;;;;;;;;;
AT;;;;;;;;;Herkunft;;1;;;;Herkunft;;;;;;;;;;;;;;;;;;;;;;;;;;
PT;81;;Laubbaum;Laubbaum;Baum_Laub;gelände_laubbaum;x;Gelände;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
AT;;;;;;;;;KronenDM;;1;;;0.001;Kronendurchmesser;;;;;;;;;;;;;;;;;;;;;;;;;;
AT;;;;;;;;;Stammumfang;;2;;;0.001;Stammumfang;;;;;;;;;;;;;;;;;;;;;;;;;;
AT;;;;;;;;;Baumart;;3;;;;Baumart;;;;;;;;;;;;;;;;;;;;;;;;;;
AT;;;;;;;;;Baumhöhe;;4;;;;Baumhöhe;;;;;;;;;;;;;;;;;;;;;;;;;;
PT;82;;Nadelbaum;Nadelbaum;BAUM_Nadel;gelände_nadelbaum;x;Gelände;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
AT;;;;;;;;;KronenDM;;1;;;0.001;Kronendurchmesser;;;;;;;;;;;;;;;;;;;;;;;;;;
AT;;;;;;;;;Stammumfang;;2;;;0.001;Stammumfang;;;;;;;;;;;;;;;;;;;;;;;;;;
AT;;;;;;;;;Baumart;;3;;;;Baumart;;;;;;;;;;;;;;;;;;;;;;;;;;
AT;;;;;;;;;Baumhöhe;;4;;;;Baumhöhe;;;;;;;;;;;;;;;;;;;;;;;;;;
PT;83;;Böschung oben;Böschung oben;Kreuz;Gelände_Böschung-oben_Punkt;x;Gelände;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
AT;;;;;;;;;Herkunft;;1;;;;Herkunft;;;;;;;;;;;;;;;;;;;;;;;;;;
PL;83;;Böschung oben;Böschung oben;;Gelände_Böschung-oben;x;Gelände;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
AT;;;;;;;;;Herkunft;;1;;;;Herkunft;;;;;;;;;;;;;;;;;;;;;;;;;;
PT;84;;Böschung unten;Böschung unten;Kreuz;Gelände_Böschung-unten_Punkt;x;Gelände;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
AT;;;;;;;;;Herkunft;;1;;;;Herkunft;;;;;;;;;;;;;;;;;;;;;;;;;;
PL;84;;Böschung unten;Böschung unten;;Gelände_Böschung-unten;x;Gelände;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
AT;;;;;;;;;Herkunft;;1;;;;Herkunft;;;;;;;;;;;;;;;;;;;;;;;;;;
SG;83;;Böschung;Böschung;;Gelände;x;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
PT;101;;Polygonpunkt;Polygonpunkt;vpallgem;Vermessung_Polygonpunkt;;Vermessung;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
AT;;;;;;;;;Herkunft;;1;;;;Herkunft;;;;;;;;;;;;;;;;;;;;;;;;;;
PT;102;;Detailpunkt;Detailpunkt;Kreuz;Vermessung_Detailpunkt;;Vermessung;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
AT;;;;;;;;;Herkunft;;1;;;;Herkunft;;;;;;;;;;;;;;;;;;;;;;;;;;
PT;103;;Detailpunkt (nicht Gelände);Detpkt.n.Gelände;Kreuz;Vermessung_Detailpunkt-(nicht-Gelände);;Vermessung;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
AT;;;;;;;;;Herkunft;;1;;;;Herkunft;;;;;;;;;;;;;;;;;;;;;;;;;;
PT;104;;Detailpunkt (Fassade);Detpkt Fassade;Kreuz;Vermessung_Detailpunkt-(Fassade);;Vermessung;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
AT;;;;;;;;;Herkunft;;1;;;;Herkunft;;;;;;;;;;;;;;;;;;;;;;;;;;
PT;105;;Geländepunkt;Geländepunkt;SYM402;Vermessung_Geländepunkt;;Vermessung;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
AT;;;;;;;;;Herkunft;;1;;;;Herkunft;;;;;;;;;;;;;;;;;;;;;;;;;;
PT;106;;Standpunkt;Standpunkt;SYM004;Vermessung_Standpunkt;;Vermessung;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
AT;;;;;;;;;Herkunft;;1;;;;Herkunft;;;;;;;;;;;;;;;;;;;;;;;;;;
PT;107;;Anschlusspunkt;Anschlusspunkt;SYM004;Vermessung_Anschlusspunkt;;Vermessung;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
AT;;;;;;;;;Herkunft;;1;;;;Herkunft;;;;;;;;;;;;;;;;;;;;;;;;;;
PT;108;;Festpunkt;Festpunkt;SYM004;Vermessung_Festpunkt;;Vermessung;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
AT;;;;;;;;;Herkunft;;1;;;;Herkunft;;;;;;;;;;;;;;;;;;;;;;;;;;
PT;201;;Mauer;Mauer;Kreuz;Bauwerke_Mauer_Punkt;;Bauwerke;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
AT;;;;;;;;;Herkunft;;2;;;;Herkunft;;;;;;;;;;;;;;;;;;;;;;;;;;
PL;201;;Mauer;Mauer;;Bauwerke_Mauer;;Bauwerke;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
AT;;;;;;;;;Breite;;1;;;0,001;Breite;;;;;;;;;;;;;;;;;;;;;;;;;;
AT;;;;;;;;;Herkunft;;2;;;;Herkunft;;;;;;;;;;;;;;;;;;;;;;;;;;
AT;;;;;;;;;Signaturabstand;;3;;;;Signaturabstand;;;;;;;;;;;;;;;;;;;;;;;;;;
PT;812;;Waldrand;Waldrand;Kreuz;Gelände_Waldrand_Punkt;;Gelände;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
AT;;;;;;;;;Herkunft;;1;;;;Herkunft;;;;;;;;;;;;;;;;;;;;;;;;;;
PL;812;;Waldrand;Waldrand;;Gelände_Waldrand;;Gelände;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
AT;;;;;;;;;Herkunft;;1;;;;Herkunft;;;;;;;;;;;;;;;;;;;;;;;;;;
PT;813;;Pflanzfläche;Pflanzfläche;Kreuz;gelände_pflanzfläche_punkt;;Gelände;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
PL;813;;Pflanzfläche;Pflanzfläche;;Gelände_Pflanzfläche;;Gelände;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
AT;;;;;;;;;Herkunft;;1;;;;Herkunft;;;;;;;;;;;;;;;;;;;;;;;;;;
PT;814;;Laubbaumgruppe;Laubbaumgruppe;Kreuz;gelände_laubbaumgruppe_punkt;;Gelände;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
PL;814;;Laubbaumgruppe;Laubbaumgruppe;;Gelände_Laubbaumgruppe;;Gelände;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
AT;;;;;;;;;Herkunft;;1;;;;Herkunft;;;;;;;;;;;;;;;;;;;;;;;;;;
AT;;;;;;;;;Seite;;2;;;;Seite;;;;;;;;;;;;;;;;;;;;;;;;;;
PT;815;;Nadelbaumgruppe;Nadelbaumgruppe;Kreuz;gelände_nadelbaumgruppe_punkt;;Gelände;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
PL;815;;Nadelbaumgruppe;Nadelbaumgruppe;;Gelände_Nadelbaumgruppe;;Gelände;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
AT;;;;;;;;;Herkunft;;1;;;;Herkunft;;;;;;;;;;;;;;;;;;;;;;;;;;
AT;;;;;;;;;Seite;;2;;;;Seite;;;;;;;;;;;;;;;;;;;;;;;;;;
PT;816;;Hecke, Gebüsch;Hecke, Gebüsch;Kreuz;Gelände_Hecke-Gebüsch_Punkt;;Gelände;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
AT;;;;;;;;;Herkunft;;1;;;;Herkunft;;;;;;;;;;;;;;;;;;;;;;;;;;
PL;816;;Hecke, Gebüsch;Hecke, Gebüsch;;Gelände_Hecke-Gebüsch;;Gelände;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
AT;;;;;;;;;Herkunft;;1;;;;Herkunft;;;;;;;;;;;;;;;;;;;;;;;;;;
AT;;;;;;;;;Seite;;2;;;;Seite;;;;;;;;;;;;;;;;;;;;;;;;;;
AT;;;;;;;;;Parallellinie;;3;;;;Parallellinie;;;;;;;;;;;;;;;;;;;;;;;;;;
AT;;;;;;;;;Breite;;4;;;;Breite;;;;;;;;;;;;;;;;;;;;;;;;;;
TX;817;;Bewuchs Beschriftung;Bewuchs Beschr;;Gelände_Bewuchs-Beschriftung;;Gelände;Text;;1;;;;;;;;;;;;;;;;;;;;;;;;NORM_K;1,8;;1;2,5;;
TX;818;;Bewuchs Beschriftung klein;Bewuchs Beschr kl;;Gelände_Bewuchs-Beschriftung;;Gelände;Text;;1;;;;;;;;;;;;;;;;;;;;;;;;NORM_K;1,5;;1;2,5;;
PT;819;;Uferlinie;Uferlinie;Kreuz;Gewässer_Uferlinie_Punkt;;Gewässer;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
AT;;;;;;;;;Herkunft;;1;;;;Herkunft;;;;;;;;;;;;;;;;;;;;;;;;;;
PL;819;;Uferlinie;Uferlinie;;Gewässer_Uferlinie;;Gewässer;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
AT;;;;;;;;;Herkunft;;1;;;;Herkunft;;;;;;;;;;;;;;;;;;;;;;;;;;
PT;820;;Durchlass, unterirdischer Wasserlauf;Durchlass Wasser;Kreuz;Gewässer_Durchlass_unterirdischer-Wasserlauf_Punkt;;Gewässer;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
AT;;;;;;;;;Herkunft;;1;;;;Herkunft;;;;;;;;;;;;;;;;;;;;;;;;;;
PL;820;;Durchlass, unterirdischer Wasserlauf;Durchlass Wasser;;Gewässer_Durchlass_unterirdischer-Wasserlauf;;Gewässer;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
AT;;;;;;;;;Herkunft;;1;;;;Herkunft;;;;;;;;;;;;;;;;;;;;;;;;;;
PT;821;;Fähre;Fähre;Kreuz;Gewässer_Fähre;;Gewässer;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
AT;;;;;;;;;Herkunft;;1;;;;Herkunft;;;;;;;;;;;;;;;;;;;;;;;;;;
PL;821;;Fähre;Fähre;;Gewässer_Fähre;;Gewässer;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
AT;;;;;;;;;Herkunft;;1;;;;Herkunft;;;;;;;;;;;;;;;;;;;;;;;;;;
PT;822;;Bruchkante;Bruchkante;Kreuz;Gelände_Bruchkante_Punkt;;Gelände;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
AT;;;;;;;;;Herkunft;;1;;;;Herkunft;;;;;;;;;;;;;;;;;;;;;;;;;;
PL;822;;Bruchkante;Bruchkante;;Gelände_Bruchkante;;Gelände;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
AT;;;;;;;;;Herkunft;;1;;;;Herkunft;;;;;;;;;;;;;;;;;;;;;;;;;;
PT;901;;Hauptachse;Hauptachse;Kreuz;Vermessung_Hauptachse_Punkt;;Vermessung;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
PL;901;;Hauptachse;Hauptachse;;Vermessung_Hauptachse;;Vermessung;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
PT;902;;Nebenachse;Nebenachse;Kreuz;Vermessung_Nebenachse_Punkt;;Vermessung;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
PL;902;;Nebenachse;Nebenachse;;Vermessung_Nebenachse;;Vermessung;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
TX;903;;Sonstige Beschriftung 1.2mm;Beschr 1.2mm;;Layout_Sonstige-Beschriftung;;Layout;Text;;1;;;;;;;;;;;;;;;;;;;;;;;;NORM_K;1,2;;1;2,5;;
TX;904;;Sonstige Beschriftung 1.5mm;Beschr 1.5mm;;Layout_Sonstige-Beschriftung;;Layout;Text;;1;;;;;;;;;;;;;;;;;;;;;;;;NORM_K;1,5;;1;2,5;;
TX;905;;Sonstige Beschriftung 1.8mm;Beschr 1.8mm;;Layout_Sonstige-Beschriftung;;Layout;Text;;1;;;;;;;;;;;;;;;;;;;;;;;;NORM_K;1,8;;1;2,5;;
TX;906;;Sonstige Beschriftung 2.5mm;Beschr 2.5mm;;Layout_Sonstige-Beschriftung;;Layout;Text;;1;;;;;;;;;;;;;;;;;;;;;;;;NORM_K;2,5;;1;2,5;;
TX;907;;Sonstige Beschriftung 3.5mm;Beschr 3.5mm;;Layout_Sonstige-Beschriftung;;Layout;Text;;1;;;;;;;;;;;;;;;;;;;;;;;;NORM_K;3,5;;1;2,5;;
TX;908;;Sonstige Beschriftung 5mm;Beschr 5mm;;Layout_Sonstige-Beschriftung;;Layout;Text;;1;;;;;;;;;;;;;;;;;;;;;;;;NORM_K;5;;1;2,5;;
TX;909;;Sonstige Beschriftung 7mm;Beschr 7mm;;Layout_Sonstige-Beschriftung;;Layout;Text;;1;;;;;;;;;;;;;;;;;;;;;;;;NORM_K;7;;1;2,5;;
TX;910;;Sonstige Beschriftung 10mm;Beschr 10mm;;Layout_Sonstige-Beschriftung;;Layout;Text;;1;;;;;;;;;;;;;;;;;;;;;;;;NORM_K;10;;1;2,5;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
LI-DEF;99;;LinieAnfang;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
LI-DEF;99;;LinieAnfang;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
LI-DEF;9;;LinieEnde;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
LI-DEF;-;;LinieEndeVorMC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
LI-DEF;1;;LinieSchliessen;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
LI-DEF;2;;LinieUebergang;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
LI-DEF;33;;FluchtPkt;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
LI-DEF;3;;FluchtPktMitAbst;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
LI-DEF;4;;Bogen;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
LI-DEF;5;;Tangentenbogen;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
LI-DEF;6;;Kreis;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
LI-DEF;7;;Rechteck;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
LI-DEF;8;;Parallelogramm;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
LI-DEF;44;;ReWinkelLinks;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
LI-DEF;66;;ReWinkelRechts;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
LI-DEF;0;;Massbandkodierung;;;;;;;;;;;0,001;;;;;;;;;;;;;;;;;;;;;;;;;;;
LI-DEF;gn;;Gruppierung;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
LI-DEF;gn3;;Gruppierung3Linien;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
MASSBAND-DEF;-;;Links;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
MASSBAND-DEF;V;;Vorne;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
MASSBAND-DEF;+;;Rechts;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
MASSBAND-DEF;Z;;Zurueck;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
MASSBAND-DEF;B;;Beenden;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
MASSBAND-DEF;S;;Schliessen;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
SY-DEF;-;;SymbolUmkehrung;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
SY-DEF;9;;SymbolUmkehrungGeometrieCode;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
MESSREIHENFOLGE-DEF;999;;Start;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
MESSREIHENFOLGE-DEF;-999;;Ende;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
MESSREIHENFOLGE-DEF;998;;Auslassen;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
MESSREIHENFOLGE-DEF;997;;Fuellcode;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
MESSREIHENFOLGE-DEF;996;;Hinzufuegen;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
MESSREIHENFOLGE-DEF;995;;Ignorieren;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
getestet und noch einmal mit einer Abfrage erweitern müssen.

Macht man das so, oder gibt es da elegantere Möglichkeiten?

Code: Alles auswählen

import csv
from pprint import pprint

CSV_DELIMITER = ';'

CSV_SECTION_NAME_TO_TYPE_CODE = {
    'Attribut': 'AT',
    'Punkt': 'PT',
    '2-Punktsymbol': 'SY',
    '3-Punktsymbol': 'SY',
    'Fläche': 'FL',
    'Linienzug': 'PL',
    'Text': 'TX',
    'SG': 'SG'
}

CSV_ATTRIBUTE_TYPE_CODE = CSV_SECTION_NAME_TO_TYPE_CODE['Attribut']
CSV_OBJECT_TYPE_CODES = sorted(set(CSV_SECTION_NAME_TO_TYPE_CODE.values()))

CSV_NOT_NEEDED_KEYS = ['LI-DEF', 'MASSBAND-DEF', 'SY-DEF', 'MESSREIHENFOLGE-DEF']


def trim_row(row):
    return {key: value for key, value in row.items() if value != ''}


def main():
    csv_objects = []
    with open('DE_Lageplan.csv', newline='', encoding='ansi') as csv_datei:
        csv_reader = csv.DictReader(csv_datei, delimiter=CSV_DELIMITER)
        header = csv_reader.fieldnames
        for row_number, row in enumerate(csv_reader, start=1):
            '''
            if not row[header[0]]:
                break
            '''

            if row[header[0]] != '' and row[header[0]] not in CSV_NOT_NEEDED_KEYS:

                if row['Objektart'] not in CSV_OBJECT_TYPE_CODES:
                    raise ValueError(
                        f'Unbekannte Objektart in Zeile {row_number + 1}:'
                        f' {row["Objektart"]!r} (erwartet wird {CSV_OBJECT_TYPE_CODES})'
                    )

                row = trim_row(row)

                if row['Objektart'] == CSV_ATTRIBUTE_TYPE_CODE:
                    csv_objects[-1]['attributes'].append(row)
                else:
                    row['attributes'] = []
                    csv_objects.append(row)

    pprint(csv_objects, sort_dicts=False)
    print(
        f'Anzahl der ausgelesenen Objekte: {len(csv_objects)}'
        f' (bis Zeile {row_number + 1})'
    )


if __name__ == '__main__':
    main()
Normalerweise hätte ich eher so etwas wie

Code: Alles auswählen

            if row[header[0]] == '' or row[header[0]] in CSV_NOT_NEEDED_KEYS:
                continue
eingebaust, aber laut @blackjack wäre so etwas eher ungünstig.
Benutzeravatar
__blackjack__
User
Beiträge: 13268
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

Das `sorted()` macht aus dem `set()` ja wieder eine Liste, das macht keinen Sinn.

"ansi" als Kodierung ist ja noch schlimmer als keine Kodierung. Es hat im Grunde den gleichen Effekt *plus* Festlegung auf Windows only.

Zeichenketten sind keine Kommentare. Die werden mit # eingeleitet.

Warum steht da mal ``header[0]`` und mal "Objektart"?

Die Initialisierung von `row_number` vor der Schleife fehlt wieder.

Ungetestet:

Code: Alles auswählen

#!/usr/bin/env python3
import csv
from pprint import pprint

CSV_DELIMITER = ";"
CSV_OBJECT_TYPE_COLUMN_NAME = "Objektart"
CSV_OBJECT_TYPE_CODES = {"AT", "FL", "PL", "PT", "SG", "SY", "TX"}
CSV_ATTRIBUTE_TYPE_CODE = "AT"
assert CSV_ATTRIBUTE_TYPE_CODE in CSV_OBJECT_TYPE_CODES

CSV_TYPE_CODES_TO_IGNORE = {
    "LI-DEF",
    "MASSBAND-DEF",
    "MESSREIHENFOLGE-DEF",
    "SY-DEF",
}


def trim_row(row):
    return {key: value for key, value in row.items() if value != ""}


def main():
    csv_objects = []
    with open("DE_Lageplan.csv", newline="", encoding="cp1252") as csv_datei:
        csv_reader = csv.DictReader(csv_datei, delimiter=CSV_DELIMITER)
        header = csv_reader.fieldnames
        if header[0] != CSV_OBJECT_TYPE_COLUMN_NAME:
            raise ValueError(f"unexpected column name {header[0]!r}")
        
        row_number = 1
        for row_number, row in enumerate(csv_reader, 2):
            type_code = row[CSV_OBJECT_TYPE_COLUMN_NAME]
            if type_code and type_code not in CSV_TYPE_CODES_TO_IGNORE:
                if type_code not in CSV_OBJECT_TYPE_CODES:
                    raise ValueError(
                        f"Unbekannte Objektart in Zeile {row_number}:"
                        f" {type_code!r} (erwartet wird"
                        f" {sorted(CSV_OBJECT_TYPE_CODES)})"
                    )

                row = trim_row(row)

                if type_code == CSV_ATTRIBUTE_TYPE_CODE:
                    csv_objects[-1]["attributes"].append(row)
                else:
                    row["attributes"] = []
                    csv_objects.append(row)

    pprint(csv_objects, sort_dicts=False)
    print(
        f"Anzahl der ausgelesenen Objekte: {len(csv_objects)}"
        f" (bis Zeile {row_number})"
    )


if __name__ == "__main__":
    main()
Please call it what it is: copyright infringement, not piracy. Piracy takes place in international waters, and involves one or more of theft, murder, rape and kidnapping. Making an unauthorized copy of a piece of software is not piracy, it is an infringement of a government-granted monopoly.
Antworten