Textdateien lesen und verarbeiten (Java)?
Hallo, ich mache ein Praktikum bei einer Firma und habe die Aufgabe bekommen aus vielen grossen Textdateien Daten zu lesen und zu sammeln. Das ist jedesmal ewtas anderes aber oft sehen sie ungefähr so aus:
123 452 9890
445 312 134
884 452 900
(also nicht genau so aber vom Prinzip her, also immer Zahlen in Zeilen und Spalten)
Und dann muss man die erste Spalte summieren oder die dritte dazuzählen und sowas. Ich kann nicht sagen wofür das ist aber ich glaube egal.
Jedenfalls hat man mir gesagt ich kann dafür jede Sprache verwenden aber ich kann nur ein kleines bisschen Java aus einem Kurs letztes Jahr. Mein Betreuer hier sagt er glaubt das man das in Phyton machen sollte, aber das kann ich noch gar nicht.
Kann man sowas gut in Java machen oder soll ich doch Phyton lernen? Ich weiß gar nicht wo ich anfangen soll. Es ist nicht sehr dringend und ich darf auch ein paar Tage probieren und lernen.
1 Antwort
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.
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.
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 :)