Frage zu CSV-Datei und Java?
Hallo zusammen,
kann mir jemand bei diesen Probleme helfen? Ich weiß wirklich nicht, wie ich da rangehen muss.
- Aufgabe ist, dass ich Anzahl der in der eingegeben CSV-Datei gespeicherten Personen bzw. Eintrage zurückgeben soll und zwar mit der Funktion public static int countCsvData_CSV_NUM (List csvData)
- public static List selectCsvDataByYear_CSV_NUM (List csvData, int selectedYear): diese Funktion (im Datenbankenkontext bekannt als Selektion) soll als Eingabe die Daten aus der CSV-Datei als Arrayliste bekommen (siehe ESL-0-Zettelserie Aufgabe 2.1) und ein konkretes Geburtsjahr. Setzen Sie voraus, dass das Geburtsjahr an dritter Stelle im Array steht. Die zurückgegebene Liste soll nur solche Arrays enthalten, deren Geburtsjahr-Attribut selectedYear entspricht.
- public static List> selectCsvDataByValue_CSV_ASSOC (List> csvData, String selectedKey, String selectedValue): Diese Selektions-Funktion soll nun flexibler sein. Diese Funktion arbeitet man hier mit den gemappten CSV-Daten. Dieses mal ist das Attribut nicht auf Geburtsjahr festgelegt, sondern kann durch den Funktionsbenutzer mit selectedKey bestimmt werden, der zu selektierende Wert mit selectedValue. In der zurückzugebenden Liste von Maps dürfen nur solche Maps enthalten sein, die das entsprechende Attribut besitzen und dessen Wert mit dem gewünschten Wert übereinstimmt. Natürlich sollte Ihre Funktion auch für jede andere CSV-Datei korrekt funktionieren und nicht unerwartet ohne Fehlermeldung abstürzen.
- public static double avgCsvDataByTown_CSV_ASSOC (List> csvData, String selectedTown): Diese Funktion soll den Durchschnitt der Geburtsjahre aller Einwohner einer bestimmten Stadt zurückgeben. Die Stadt wird im Parameter selectedTown spezifiziert. Hat die gewählt Stadt keine Einwohner bzw. existiert diese nicht, soll 0 zurückgegeben werden. Wenn Geburtsjahre existieren, die nicht in einen gültigen Zahlenformat abgespeichert sind, soll -1 zurückgegeben werden.
1 Antwort
Zu 1)
Deinem angehängten Quellcode zufolge, hast du bereits eine Methode, um alle Zeilen der CSV-Datei einzulesen. Das erklärt dann auch, wieso countCsvData_CSV_NUM eine Liste übergeben bekommen soll.
Die erste Aufgabe ist also nur Recherchearbeit, denn Listen kennen ihre Länge und haben auch eine Methode, die diese zurückgibt.
Hier findest du die API Referenz der Java Standardbibliothek: https://docs.oracle.com/en/java/javase/14/docs/api/index.html. In der kannst du nach den Methoden des List-Interface nachschlagen.
Zu 2)
Erneut wird dir schon einiges abgenommen. Die gerade schon erwähnte Methode, die die CSV-Datei einliest, trennt sogar bereits die Spalten auf. Deshalb werden den print-Methoden auf deinem Aufgabenblatt generische Listen übergeben.
List<String[]>
Jeder Eintrag in der Liste entspricht einer Zeile aus der CSV-Datei in Form eines Arrays. Jeder Array-Eintrag entspricht einer Spalte.
Die euch vorgegebenen Methodensignaturen sind übrigens falsch. Statt List sollte für Aufgabe 1 und 2 jeweils List<String[]> dort stehen.
Aber alles was du nun machen musst, ist, mit einer Schleife über die Liste zu iterieren und in jedem Eintrag den dritten Eintrag herauszuziehen und mit der Jahreszahl zu vergleichen, die der Methode übergeben wird. Wenn es passt, wird die Spalte in einer neuen Liste gespeichert, ansonsten nicht.
Zu 3)
Gleiches Prinzip, mit dem einzigen Unterschied, dass du dich mit dem Datentyp Map auseinandersetzen solltest. Dazu findest du in der API Referenz von Java natürlich ebenso eine eigene Seite.
Für das Einlesen der CSV-Datei wird diesmal die ...assoc-Methode benutzt, die auf deinem Codeblatt erwähnt wird. Der korrekte Typ für deinen ersten Parameter lautet List<Map<String, String>>.
Zu 4)
Wie in der vorherigen Aufgabe sammelst du erst einmal die richtigen Einträge in einer Liste. Danach gehst du noch einmal über diese Liste drüber, ermittelst die entsprechenden Jahreszahlen, addierst sie miteinander und dividierst die Summe mit der Anzahl an Listeneinträgen.
Es gibt auch die Möglichkeit, die Daten schon beim ersten Sammelvorgang zu holen und den Durchschnitt zu berechnen, doch ich denke, der Zwischenschritt mit einer Zwischenliste ist für dich einfacher.
Kurzum: Es ist nur etwas Recherchearbeit vonnöten und mit einigen Grundlagen wie Kontrollstrukturen (Schleifen, Verzweigungen) solltest du zurechtkommen.
Die Syntax ist falsch. Die Liste besteht aus String-Arrays und der Laufvariable fehlt ein Name.
for (String[] entry : csvData) {
for (String[] entry : csvData) {
csvData.get(3);
if...
}
die get methode müsste definitiv passen aber wahrscheinlich ist die Umsetzung falsch... die drei müsste ja den dritten Eintrag bedeuten, oder ich habe das Konzept nicht richtig verstanden.
Du hast die Schleife nicht verstanden.
Angenommen, die Liste sieht visuell so aus:
data = {
[ "a", "b", "c" ],
[ "d", "e", "f" ],
[ "g", "h", "i" ]
}
Dann nimmt sich die Schleife je Iterationsschritt einen Eintrag (ein String-Array) heraus und speichert diesen in entry. Dieser Beispielcode:
for (String[] entry : data) {
System.out.println(entry[0]);
}
würde demzufolge für diese Ausgabe sorgen:
a
d
g
zu 2 habe ich jetzt for(String: csvData){ oder ist der Anfang bereits schon falsch?