Thread Mit while durch file loopen und aktuelle line veraendern (27 answers)
Opened by Student87 at 2012-11-13 10:40

Student87
 2012-11-17 14:03
#163345 #163345
User since
2012-11-08
73 Artikel
BenutzerIn
[default_avatar]
Hi und pardon für die lange Sendepause!

Das Problem war folgendes:

Das Inpute-file hatte 1 Million Zeilen. 1 Zeile entsprach einer Position auf der DNA. Für die Zeilen 1 bis 1000 brauchte ich den Mittelwert von Spalte y (Also der Mittelwert der ersten 1000 Positionen der DNA). Ebenso brauchte ich für die Zeilen 1001 bis 2000 den Mittelwert der Spalte y und so weiter immer in 1000er-Intervallen bis zum Intervall 999001-1000000.
Problematisch war, dass das Input-file nicht exakt 1 Mio Zeilen enthielt, sondern manche fehlten. Und ich wußte nicht, welche.
Glücklicherweise gab Spalte x des files die Position an. Die Zeile mit dem x-Wert 4056 sollte z.B. nur in dem Intervall 4001-5000 verwertet werden.
Deswegen sah mein Ansatz wie folgt aus:

Öffne das file und packe alle Zeilen, wo Spalte x im aktuellen Intervall (Intervall wird immer erhöht bis 999001-1000000) liegt in einen Array. Jetzt will ich aber nicht für jedes Intervall durch die gesamte ~1Mio-Zeilen-Datei rattern. Ergo: Ist Spalte x höher als das obere Limit des aktuellen Intervalls (Für das Intervall 1-1000 würde das bedeuten: Ich bin an DNA-Position 1001 oder höher), hör sofort auf, die Datei zu lesen. Danach werte den Array aus (D.h., bilde den Mittelwer von Spalte y - das ganze nur, falls der Array nicht leer ist, was auch oft vorkam - d.h., 1000 Zeilen fehlten) und schreibe die Ergebnisse in der Form "Intervall, y-Mittelwert" in die Output-Datei.

Das würde aber bedeuten, dass er für das Intervall 999001-1000000 erst durch alle Zeilen 1 bis ~999001 rattert ("~" weil: je nachdem, wieviele Zeilen fehlen). Denn erst in Zeile ~999001 findet der Algorithmus einen im Intervall liegenden x-Wert. Um diese Rechenzeit zu umgehen, wollte ich alle abgearbeiteten Zeilen aus dem file löschen. Die Lösung war jetzt, dass ich nach der Abarbeitung des Intervalls 1-1000 den filepointer als Variable gespeichert habe. So konnte ich beim öffnen der Datei für das Intervall 1001-2000 den filepointer direkt ans Ende des Intervalls 1-1000 setzen und ersparte dem Algorithmus somit das Durchrattern der bereits abgearbeiteten Zeilen.


2012-11-14T21:15:24 Linuxer
Frag ruhig nach, wenn was unklar ist.


Hab ihn mittlerweile fast durch, aber:

1) Warum speicherst du den Dateipfad in einer zusätzlichen Code-Zeile in einer Variablen? Wird dadurch der Code nicht unnötig lang? Ich könnte mir vorstellen, dass das Gegenargument "Sicherheit" lautet, richtig?

2) Was macht "LINE:" ? Kann man damit etwa "while-handles" erschaffen so wie bei file-handles ?

3) Woher kommt der array @ARGV ? Ich hab mir die shift-Funktion angeguckt in der Perl-Doc, aber verstehe nicht, wieso bei einem array namens @ARGV das erste Element entfernst um es in die Variable $infile zu packen ?

4) Ist in Zeile 8 ein Punkt zuviel ? Bzw. was macht dieser Punkt außerhalb der quote-marks ?
Last edited: 2012-11-17 14:09:14 +0100 (CET)

View full thread Mit while durch file loopen und aktuelle line veraendern