# Übungen zu Dateine (Teil 1)


## Ausgangslage

Im Ordner `uebungen` sind folgende Textdateien mit Mitarbeiter- und
Planstellendaten vorhanden:

* `employee_skills.txt`
* `job_skills.txt`
* `salaries.txt`
* `salaries-errors.txt`

Jede dieser Dateien enthält einen Datensatz pro Zeile. Jede Zeile ist
nach folgendem Schema aufgebaut:

* Name
* Doppelpunkt
* Whitespace (ein oder mehrere Leerzeichen)
* Daten

Das Format des Datenfelds unterscheidet sich je nach Datei.


Aufgabe 1:

Öffnen Sie die Datei `employee_skills.txt` zum Lesen und lesen Sie die gesamte
Datei in einen String ein.

Wieviele Bytes ist der Dateihalt lang?


Aufgabe 3:

Öffnen Sie die Datei `employee_skills.txt` zum Lesen und lesen Sie die Datei
zeilenweise ein.

Wieviele Zeilen mit Daten enhält die Datei? Zeilen, die *nur* Whitespace
(Leerzeichen, CR, LF, Tabs, etc.) enthalten, werden nicht gezählt.


Aufgabe 3:

Öffnen Sie die Datei `employee_skills.txt` zum Lesen und lesen Sie die Datei
zeilenweise ein. Parsen Sie den Namen des Mitarbeiters aus jeder Datenzeile und
fügen Sie ihn zu einer Liste hinzu.

Geben Sie die Liste der Namen der Mitarbeiter alphabetisch sortiert, ein Name
pro Zeile, aus.


Tipp: verwenden Sie die String-Methode `split()` zum Parsen jeder Zeile.


Aufgabe 4:

Öffnen Sie die Datei `salaries.txt` zum Lesen und lesen Sie die Datei
zeilenweise ein. Parsen Sie den Namen des Mitarbeiters sowie das Gehalt aus
jeder Datenzeile und speichern die Daten in einem Dictionary mit dem Namen
des Mitarbeiters als Key und dem Gehalt als Wert. Der Gehaltswert sollte
jeweils in einen Integerwert umgewandelt werden.

Geben Sie das höchste, sowie das niedrigste Gehalt aus.


Tipp 1: verwenden Sie die String-Methode `split()` zum Parsen jeder Zeile und
die Funktion `int()` zum Umwandeln des Gehaltwerts.

Tipp 2: verwenden Sie die `min()` und `max()` Funktionen und wenden sie jeweils
auf alle Werte des Dictionaries auf einmal an.


Aufgabe 5:

Öffnen Sie die Datei `employee_skills.txt` zum Lesen und lesen Sie die Datei
zeilenweise ein. Parsen Sie den Namen des Mitarbeiters sowie die Liste der
Skills aus jeder Datenzeile und speichern die Daten in einem Dictionary mit dem
Namen des Mitarbeiters als Key und der Liste der Skills als Wert. Die Liste der
Skills für jeden Mitarbeiter sollte jeweils in eine Liste von Strings (ein
Element pro Skill) umgewandelt werden.

Tipp 1: verwenden Sie die String-Methode `split()` zum Parsen jeder Zeile und
nochmals zum Parsen der Liste der Skills. Dabei müssen jeweils unterschiedliche
Trennzeichen verwendet werden.


Aufgabe 6:

Kombinieren Sie die Programme aus Aufgabe 4 und 5 und kombinieren Sie die
beiden Dictionaries, die Sie aus den Daten erstellt haben.

Speichern Sie dabei das Gehalt und die Skills jedes Mitarbeiters jeweils
zusammen in einem Dictionary mit folgendem Format:

```py
employee_data = {
    "salary": ...,   # integer
    "skills": [...], # list of strings
}
```

Speichern Sie alle Daten in einem Dictionary mit dem Namen des Mitarbeiters
als Key und dem `employee_data` Dictionary als Wert. Dadurch ergibt sich
folgende geschachtelte Datenstruktur:

```py
employees = {
    "name 1": {
        "salary": ...,
        "skills": [...],
    },
    "name 2": {
        "salary": ...,
        "skills": [...],
    },
    ...
}
```


Aufgabe 7:

Diese Aufgabe ist ähnlich wie Aufgabe 4, die einzulesende Datei enthält jedoch
mehrere Fehler, die Sie abfangen und behandeln müssen.

Öffnen Sie die Datei `salaries-errors.txt` zum Lesen und lesen Sie die Datei
zeilenweise ein. Parsen Sie den Namen des Mitarbeiters sowie das Gehalt aus
jeder Datenzeile und speichern die Daten in einem Dictionary mit dem Namen
des Mitarbeiters als Key und dem Gehalt als Wert. Der Gehaltswert sollte
jeweils in einen Integerwert umgewandelt werden.

Die Datei enthält folgende Fehler:

* Manche Zeilen sind auskommentiert (d.h. sie starten mit einem Hash (`#`).
  dise Zeilen sollen ignoriert werden, d.h. sie werden nicht in den Daten
  gespeichert.
* Bei manchen Zeilen fehlt der trennende Doppelpunkt zwischen dem Namen und
  dem Gehalt. Fangen Sie diesen Fehler beim Parsen der Zeile ab und
  ignorieren Sie entweder die Zeile oder versuchen Sie sie erneut mit einer
  anderen Methode zu parsen.
* Bei manchen Mitarbeitern ist das Gehalt mit einem Währungssymbol angegeben.
  Fangen Sie den Fehler beim Umwandeln des Gehaltwerts in einen Integer ab und
  ignorieren Sie entweder die Zeile oder entfernen Sie das Währungssymbol vor
  dem Parsen.


Geben Sie das höchste, sowie das niedrigste Gehalt aus.
