Thread Auslesen verschiedener Daten aus einem File: Wie programmiere ich übersichtlich und effizient?
(3 answers)
Opened by Sven_123 at 2011-09-23 14:02
Hallo,
ich scripte meist nur kleine Hilfsprogrämmchen, die mir Dinge wie Aufräumen, Daten plotten etc. erleichtern. Seit einiger Zeit sitz ich allerdings an einem etwas größeren (für mich) Programm (zur Zeit gut 1000 Zeilen) und glaube zwar, dass es im großen und ganzen ganz lesbar ist, trotzdem gibt es ein zwei Stellen, die langsam unübersichtlich werden (v.a. wenn jemand anders da mal reinschauen möchte) - deswegen, aber auch aus bloßer Neugier würde mich oft interessieren, wie wirkliche Programmierer Dinge aufbauen. Ein Problem ist folgendes: Ich lese log-files eines anderen Programms ein (1000-5000 Zeilen, ca. 1000 mal) und muss verschiedene Informationen auslesen. Was genau hängt zum einen von Einstellungen ab, die vor der Durchführung getroffen werden, zum anderen von Dingen, die das Programm in der Laufzeit selbst ermittelt. An simplen Dingen fallen mir zum Auslesen drei Methoden ein: 1. Jedesmal wenn ich eine Information brauche, öffne ich die Datei und durchsuche sie. Vorteil: Recht übersichtlich, v.a. wenn man die einzelnen Suchen in kleine Subroutinen "getxyz()" aulagert; Nachteil: Wenn ich zehn Sachen such, wird die Datei zehn mal durchsucht... Code (perl): (dl
)
1 2 3 4 5 6 7 #...viel Programm...benötige $energie: open my $in, "< logfile" or die "geht nicht\n"; while (<$in>){if (/Energie: (\d+)/){$energie = $1; last}} ... #...mehr Programm...benötige $gradient: open my $in, "< logfile" or die "geht nicht\n"; while (<$in>){if (/Gradient: (\d+)/){$gradient = $1; last}} 2. Ich durchsuche die Datei einmal und prüf in jeder Zeile, welche Informationen ich brauch. Vorteil: Wenig Code; Nachteil: Ich überprüf in jeder Zeile der ausgelesen Datei, was überhaupt benötigt wird. Wird irgendwann unübersichtlich; Code (perl): (dl
)
1 2 3 4 5 open my $in, "< logfile" or die "geht nicht\n"; while (<$in>){ if ((/Energie: (\d+)/) && ($brauchene) ){$energie = $1} if ((/Gradient: (\d+)/) && ($brauchgrad)){$gradient = $1} } 3. Ich schreibe für jede Kombination von Möglichkeiten eine Ausleseroutine und such mir in der Laufzeit aus, welche ich brauch. Vorteil: Effizient; Nachteil: Unübersichtlich und viiiiel Code; Code (perl): (dl
)
1 2 3 4 5 6 7 8 9 10 open my $in, "< logfile" or die "geht nicht\n"; if ($brauchene){ if ($brauchgrad){ while (<$in>){such nach Energie und Gradient} }else{ while (<$in>){such nach Energie} } }elsif ($brauchgrad){ while (<$in>){such nach Gradient} } Zur Zeit hab ich eine Kombination aus 2 und 3, d.h. ich hab zwei große Modi die viele Einstellungen beeinflussen in getrennten Suchroutinen und überprüf die kleineren Dinge dann innerhalb der while-Schleife. Das ganze wird langsam allerdings etwas unübersichtlich, weswegen ich als erste Verbesserung die, natürlich etwas komplizierter, als in den Beispielen aussehenden Such- und Formatiermuster in einzelne Subroutinen ausgelagert hätte, so dass ich pro gesuchter Information wirklich wieder nur eine Zeile hätte. Besonders effizient ist es vermutlich aber nicht. Am liebsten würde ich vor dem Durchsuchen festlegen können, nach was ich suche (also vom Programm wählen lassen) und dann meine while-Schleife automatisch aufbauen, aber ich weiß nicht, wie ich das hinbekomm. Geht das? Und unabhängig davon, wie würdet ihr das lösen? Freue mich über jegliche Tips, Sven :) |