Java Csv Dateien lesen und ausgeben?

2 Antworten

Was für eine Art Objekt gibt der File Reader bzw. der Importer zurück?

Kann man darüber iterieren?

Woher ich das weiß:Berufserfahrung – Software-Entwickler
theIfrit 
Fragesteller
 25.05.2018, 22:54

Das kann ich dir irgendwie nicht wirklich sagen... Der Importer gibt glaube ich eine ArrayList aus, aber nicht mit den werten die ich brauche...

0
PWolff  25.05.2018, 23:01
@theIfrit

Von einem CSV-FileReader würde ich erwarten, dass er einen Iterator über string[] zur Verfügung stellt, in dem man dann das Array-Element mit dem richtigen Index überprüfen kann und ggf. alle Array-Elemente ausgeben kann.

0

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.

theIfrit 
Fragesteller
 25.05.2018, 23:22

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?

0
regex9  25.05.2018, 23:41
@theIfrit

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));
}
0
theIfrit 
Fragesteller
 26.05.2018, 00:31
@regex9

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!

0
regex9  26.05.2018, 00:48
@theIfrit

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.

0