Ich habe zwar eine Lösung die funktioniert, aber zufrieden bin ich noch nicht - u. A. mit den folgenden zwei Dingen:
- dass ich im try-except-Bereich last_dict['attributes'] = [] 2-mal aufrufen muss und
- 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)
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})')
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;;;;;;;;;