Thread Datenzeilen einlesen (6 answers)
Opened by qwe123qwe at 2013-10-08 23:10

topeg
 2013-10-09 04:01
#171081 #171081
User since
2006-07-10
2611 Artikel
BenutzerIn

user image
Dein Ansatz ist schon in Ordnung.

Was die Ausgabe und dessen Puffern betrifft. Wenn man nicht erzwingt das Perl alle Schreibvorgänge sofort durchführt. (z.B. mit $|++ ) dann puffert Perl bis zu 16Kb. ( Beim Wert bin ich unsicher, das hängt davon ab wie Perl kompiliert wurde ) Es wird aber immer geschrieben, wenn eine Zeile vollständig ist. ( Eine Zeile endet mit "\n" ) Ich kann dir aus dem Kopf aber nicht sagen wie sich Perl verhält wenn man den Binärmodus erzwingt. ( binmode( $fh ) )

CPAN:Tie::File macht aus meiner sich nur Sinn wenn man in der Datei "herum springt" ließt man sie nur einmal ein um daraus Daten zu extrahieren produziert das Modul einiges an unnötigem Overhead.

Wie du die extrahierten Daten am besten speicherst, hängt davon ab was du Nachher damit machen willst. Folgen kompexete Auswertungen kann es sinnvoll sein die Daten in eine Relationale oder eine File Datenbank zu schreiben ( CPAN:DBI oder z.B. CPAN:BerkeleyDB ) Da zu raten fällt mir schwer ohne genau zu wissen wie die Daten weiter verarbeitet werden sollen.
Wenn die Datenmenge nicht zu groß ist kannst du sie auch direkt im Speicher halten und in Perl selber verwalten/verarbeiten. Das Verhältnis ist 1 zu 2 bis 1 zu 10. 1Mb auf der Festplatte kann 2 bis 10Mb im Speicher bedeuten.

Was das Zwischenspeichern betrifft. Soll das Script später längerfristig laufen, so ist es günstig darauf zu achten das es nicht zu viel schreibt oder ließt. Nicht nur das jede Interaktion mit dem System verhältnismäßig langsam ist. Man macht sich auch unnötige Probleme wenn mal mehrere Instanzen des Scripts laufen sollen.
Ist es aber nur eine einmalige Sache, so lohnt es sich jeden Schritt in Dateien abzulegen, damit man die Abläufe prüfen und nötigenfalls korrigieren kann, ohne das man alle Schritte erneut durchführen muss.

2013-10-08T21:10:48 qwe123qwe
2. gibt's in Perl eventuell einen Trick, das ZEITFORMAT am Zeilenanfang anstelle regex als Kriterium zu nutzen ?

Reguläre Ausdrücke sind er Trick. ;-)
Aber ich weiß was du meinst. Es wäre dir recht wenn es ein Befehl/Modul gäbe das Zeit- oder Datumsangaben erkennt. und es gibt solche Module (z.B. CPAN:Date::Parse). Die bringen dir hier aber nicht sonderlich viel
Da du ja nicht nur an der Zeit interessiert bist, sondern an allen Daten in der Zeile. Zudem ist die Erkennung zu unspezifisch. Die Module interpretieren alles was irgendwie nach Datum/Zeit aussieht. Da kannst du einige falsche Treffer bekommen. Einen guten Regulären Ausdruck halte ich für besser. Zum Beispiel so einen:

Code (perl): (dl )
1
2
my @values = $line =~/(\d+):(\d+):(\d+)\s+(\d+),(\d+)\s+([\d.]+)\s+([\d.]+)/;
next unless @values;


Um besser mit er Zeitangabe umgehen zu können kann es sich lohnen diese als Sekunden zu behandeln:
Code (perl): (dl )
1
2
3
my $sec=$values[2];
$sec+=$values[1]*60;
$sec+=$values[0]*3600;

Oder man kann ein Modul heran ziehen und es als TimeStamp behandeln:
Code (perl): (dl )
1
2
use Time::Local;
my $epoch = timelocal(@values[2,1,0],1,1,1970);

View full thread Datenzeilen einlesen