Textdateien lesen und verarbeiten (Java)?

1 Antwort

Vom Fragesteller als hilfreich ausgezeichnet
Kann man sowas gut in Java machen oder soll ich doch Phyton lernen?

Ja und ja.

Python ist sehr gut für solche "Textverwurster" geeignet. Es ist auch (zumindest in den Basics) recht schnell zu erlernen, der Teufel steckt wie immer im Detail. Bei Aufgaben wie deinen verbringt man die meiste Zeit damit, die diversen Ausnahmen und Unsauberkeiten in den Daten zu behandeln.

Trotzdem kann man sowas auch in Java gut erledigen. Eine Aufgabenstellung wie deine etwa so (Code ist beispielhaft und ungetestet):

try (var lines = Files.lines(Path.of("testdatei.tsv"))) {
  var sum =
      lines
          .map(String::strip)
          .filter(Predicate.not(String::isEmpty))
          .map(line -> line.split("\\s+")[2])
          .mapToDouble(Double::valueOf)
          .sum();
  System.out.println(sum);
}

Da lesen wir die Datei zeilenweise, beschneiden unnötige Leerzeichen, ignorieren alle leeren Zeilen, nehmen uns die 3. Spalte als Zahl und summieren sie über alle Zeilen auf. Der Vorteil von Java ist, dass durch die statische Typisierung die Entwicklungsumgebung und der Compiler helfen können, ein paar blöde Fehler zu vermeiden.

Für einen Ansatz wie oben musst du aber auch ein paar neue Dinge in Java lernen, nehme ich mal stark an. Streams etwa. Muss man zwar nicht verwenden, aber es hilft sehr.

Es kann sich auch auszahlen, eine Bibliothek für CSV/TSV und ähnliche Dateien zu verwenden (z.B. OpenCSV). Vor allem dann, wenn die Dateien nicht konsistent formatiert sind.

In welche Sprache du den Lernaufwand steckst, musst du selber entscheiden.

iQa1x  11.11.2023, 19:50

Das Programm hat den Nachteil, das es erstmal die ganze Datei in den Speicher liest, bei richtig großen Dateien geht dir da der Speicher aus.

In Java würde ich da eher mit FileReader / BufferedReader zeilenweise einlesen und direkt addieren.

Ich würde ja bei sowas gar nicht erst mit einer "richtigen" Programmiersprache anfangen, um da einmalig was zu rechnen, das tut auch die Bash :)

sum=0; while read -a i ; do sum=$(($sum + ${i[2]})) ; done <testfile.tsv ; echo $sum
0
jo135  11.11.2023, 19:56
@iQa1x
Das Programm hat den Nachteil, das es erstmal die ganze Datei in den Speicher liest

Nein, das macht es nicht - es arbeitet auf dem Stream, der von Files.lines() zurückgegeben wird. Erst beim Ausführen des Streams wird dann im üblichen Pull-Verfahren zeilenweise gelesen. Du verwechselst das vielleicht mit Files.readAllLines().

Händisches Herumfuhrwerken mit BufferedReaders kann man sich heute eigentlich sparen.

1
iQa1x  11.11.2023, 20:17
@jo135

Sorry, mein Fehler. Nehme alles Zurück und behaupte das Gegenteil ;) Habe zu lange kein Java mehr gemacht, bin von anderen Programmiersprachen davon ausgegangen, das lines da ein Array ist, weil ich .map auf einem Stream vorher noch nie gesehen habe.

1