Also der Eintrag aus Datei 2 soll über das Haustier mit dem jeweiligen Eintrag aus Datei 1 gematcht werden? (z.B. wenn aus Datei 2 der Eintrag mit dem Haustier Papagei ausgegeben wird, soll dazu der Eintrag mit Papagei aus Datei 1 ausgegeben werden?)
Das wäre (im größeren Maßstab) am ehesten was für eine SQL-Datenbank. Java hat leider keine integrierten Klassen, um CSV-Dateien zu verarbeiten, deshalb muss man da etwas selbst basteln.
Ich würde die Einträge einfach als records anlegen (das sind im Prinzip Klassen, die hauptsächlich zum Speichern von Daten da sind und sonst nicht viel können), die CSV mit einer selbst programmierten Funktion einlesen und dann halt vergleichen und passende Einträge ausgeben:
import java.io.File;
import java.io.FileNotFoundException;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.List;
import java.util.Scanner;
public class CSVTools {
public static void main(String[] args) throws FileNotFoundException {
// Personen einlesen
Scanner personenCsv = new Scanner(new File("C:\\temp\\Personen.csv"), "utf-8");
personenCsv.useDelimiter("\\R"); // pro Token eine ganze Zeile einlesen
List<Person> personen = personenCsv.tokens()
.skip(1) // Überschriftenzeile überspringen
.map(Person::parse) // Jede Zeile mit der parse-Funktion in Person übersetzen
.toList(); // Als Liste speichern
// PersonenEigenschaften einlesen
Scanner personenEigenschaftenCsv = new Scanner(new File("C:\\temp\\PersonenEigenschaften.csv"), "utf-8");
personenEigenschaftenCsv.useDelimiter("\\R"); // pro Token eine ganze Zeile einlesen
List<PersonEigenschaft> personenEigenschaften = personenEigenschaftenCsv.tokens()
.skip(1) // Überschriftenzeile überspringen
.map(PersonEigenschaft::parse) // Jede Zeile mit der parse-Funktion in PersonEigenschaft übersetzen
.toList(); // Als Liste speichern
// Zusammengehörige Einträge ausgeben (Matching über Haustiere)
for (Person person: personen) {
// Die jeweilige Person ausgeben
System.out.println(person);
// Die dazugehörigen Eigenschaften ausgeben (kann auch keine oder mehrere sein)
personenEigenschaften.stream()
.filter(eigenschaft->eigenschaft.haustier().equals(person.haustier()))
.forEach(System.out::println);
System.out.println(); // Eine Leerzeile, damit man die zusammengehörenden Einträge besser sehen kann
}
}
}
record Person(int nummer, String vorname, int alter, String haarfarbe, String land, String haustier) {
public static Person parse(String line) {
String[] fields = line.split("'?;\\s*'?"); // Zeile teilen bei Semikolon mit optionalen Leerzeichen und Hochkommas
return new Person(
Integer.parseInt(fields[0]),
fields[1],
Integer.parseInt(fields[2]),
fields[3],
fields[4],
fields[5].replace("'", "") // Hochkomma am Ende vom Haustier entfernen
);
}
}
record PersonEigenschaft(int nummer, String traumberuf, String lieblingsessen, String hobby, String haustier) {
public static PersonEigenschaft parse(String line) {
String[] fields = line.split("'?;\\s*'?"); // Zeile teilen bei Semikolon mit optionalen Leerzeichen und Hochkommas
return new PersonEigenschaft(
Integer.parseInt(fields[0]),
fields[1],
fields[2],
fields[3],
fields[4].replace("'", "") // Hochkomma am Ende vom Haustier entfernen
);
}
}
// Da du irgendwas mit der SacramentocrimeJanuary2006.csv machen willst, ist hier der passende record dazu
record Crime (LocalDateTime cdatetime, String address, int district, String beat, int grid, String crimedescr, int ucr_ncic_code, double latitude, double longitude) {
public static Crime parse(String line) {
String[] fields = line.split(",");
return new Crime(
LocalDateTime.parse(fields[0], DateTimeFormatter.ofPattern("M/d/y H:m")),
fields[1],
Integer.parseInt(fields[2]),
fields[3].strip(), // Die ganzen Leerzeichen entfernen
Integer.parseInt(fields[4]),
fields[5],
Integer.parseInt(fields[6]),
Double.parseDouble(fields[7]),
Double.parseDouble(fields[8])
);
}
}
Um noch auf die Frage im Text einzugehen, wie du auf die einzelnen Elemente einer ArrayList zugreifen kannst:
Statt z.B. person = personen[5] machst du person = personen.get(5). Und statt personen[5] = person machst du personen.set(5, person);