Java Csv Dateien lesen und ausgeben?
Hallo, ich habe folgendes Problem:
Ich möchte in einer Klasse eine Methode schreiben, die mithilfe eines Parameters bestimmte Zeilen wieder teilweise Ausgibt:
Beispiel: student.csv hat die Spalten Name;matrikelnummer;fachsemester. Mein Parameter wäre in diesem Beispiel die Matrikelnummer. Meine Methode soll mir jetzt in einem System.out den Namen und die Matrikelnummer ausgeben, die eben zu dieser Matrikelnummer gehört. Die ganzen Csv Dateien haben wir gegeben und einen CSV File Reader haben wir auch, auch einen Importer. Ich bin jedoch am verzweifeln.
Wenn sich irgendwer auskennt und mir einen Ansatz geben könnte wäre ich wirklich Dankbar! Ich bin einfach komplett verwirrt..
Vielen Dank!
Ifrit
2 Antworten
Was für eine Art Objekt gibt der File Reader bzw. der Importer zurück?
Kann man darüber iterieren?
Entweder du liest die Datei zeilenweise aus oder in einem Stück in einen String. Ersteres ist vorzuziehen, denn es ist kürzer und einfacher, bei der letztgenannten Option müsstest du den String andernfalls erst auseinanderschneiden.
Bei jeder gelesenen Zeile wäre es nun vonnöten, die einzelnen Spalten zu ermitteln. Da die Daten in einer CSV-Datei durch einen Separator getrennt werden (üblicherweise ein Komma), benötigst du lediglich die split-Methode zur Auftrennung. Aus dem daraus resultierenden Array kannst du die Matrikelnummer ziehen und mit dem gesuchten Wert vergleichen. Wenn der Vergleich erfolgreich war, kann der restliche Output erfolgen.
Sollte das Programm öfter nach Daten aus der CSV-Datei suchen sollen, wäre es sinnvoll, die Daten einmal zeilenweise in einem Aggregat (Liste, Array, ...) zu speichern und nur je Suche über dieses bereits vorhandene Aggregat zu iterieren. Um hier auch nicht jedesmal den String aufsplitten zu müssen, sollte bereits beim Ablegen der Daten in dem Aggregat pro Eintrag ein Objekt erstellt werden, welches die einzelnen Spalten in eigenen Eigenschaften aufnimmt.
Beispiel:
Aus
hans,mueller,18
lisa,schneider,22
könnte eine Liste an Objekten des Typs Person werden.
Vielen Dank schon mal. Wie kann ich denn der Methode sagen, der Parameter solle eben eine ModulID (jetzt in der Aufgabe, nicht im bsp) sein? Zudem? Wie kann ich konkret z.B. alle fields.get(1) auslesen und falls dieses mit der ModulId übereinstimmt eben fields.get(0) lesen und beides zusammen ausgeben?
Meinst du den Suchparameter? Wie man Parameter bei einer Methode halt definiert:
public void printDataForModuleId(String moduleId) {
// ...
}
Deine Folgefrage verstehe ich nicht völlig. Die Methode get, die du da erwähnst, lässt darauf schließen, dass fields womöglich eine ArrayList ist, wobei ich aber nicht weiß, was in ihren Elementen nun wirklich steht. Mit der get-Methode bekommst du allerdings bereits den Wert zurück, der bei gegebenem Index liegt. Alles was du brauchst, ist ein Vergleich und eine Ausgabe, bei der eine Konkatenation stattfindet:
if (moduleId.equals(fields.get(1)) {
System.out.println(fields.get(0) + " " + fields.get(1));
}
hmm, mir wird es schon etwas klarer. in deinem Code am Ende schreibst du ja fields.get(0) z.B., wie sage ich Java, dass es sich um die Csv datei "module.csv" handelt, die im selben Projekt im packet "moma" gespeichert ist während die klasse mit der methode in "momademo" gespeichert ist? Das ist mir noch nicht ganz klar, wie ich der Methode eben sage genau wo sie suchen soll... Danke für deine Hilfe schon mal!
Der FileReader verlangt, sobald er erstellt werden soll, in irgendeiner Art und Weise (entweder als String oder über ein Objekt vom Type File) einen Dateinamen. Bei diesem ist der Dateipfad bereits mit inbegriffen.
Variante A wäre demnach, einen richtigen Dateipfad anzugeben (relativ oder absolut). Variante B (die zu bevorzugende Option) wäre das Einlesen der Datei als Ressource.
Das kann ich dir irgendwie nicht wirklich sagen... Der Importer gibt glaube ich eine ArrayList aus, aber nicht mit den werten die ich brauche...