Schrift
[thread]12864[/thread]

mehrere Textdateien zusammenfügen

Leser: 3


<< >> 5 Einträge, 1 Seite
johnh
 2008-12-05 23:41
#116864 #116864
User since
2008-10-05
23 Artikel
BenutzerIn
[default_avatar]
Hiii,

ich möchte den Inhalt mehrerer Text dateien zusammenfügen. Mir fehlt irgendwie die Idee, wie ich es programmieren kann.

Kurz zu meiner Vorgehensweise bisher:

Die Text dateien haben folgendes Format:
Code: (dl )
1
2
3
4
[  3]  0.0-25.0 sec  8.74 MBytes  2.93 Mbits/sec  6.126 ms    0/ 6235 (0%)
[ 3] 25.0-50.0 sec 8.95 MBytes 3.00 Mbits/sec 4.945 ms 0/ 6387 (0%)
[ 3] 50.0-75.0 sec 8.93 MBytes 3.00 Mbits/sec 6.434 ms 0/ 6368 (0%)
[ 3] 75.0-100.0 sec 8.90 MBytes 2.99 Mbits/sec 4.595 ms 0/ 6351 (0%)


Mit dem folgendem Code lasse ich mir die Text Datei in Zeilen und Spalten ausgeben:
Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
open (Input1,"input.txt")|| die "input.txt file found!";
open (Result1,">output.txt")|| die "output.txt file found!";

my $a;
my $c;
my $e;
my $d;
my $f;
my $file;


my @array;
while(my $line = <Input1>)
{
if($line =~ /((\d{1,4}\.\d*) )sec/)
{
$d = $1;
@d = $1;
}

if($line =~ /((\d\.\d*) )MBytes/)
{
$a = $1;
@a = $1;
}
if($line =~ /((\d\.\d*) )Mbits/)
{
$f = $1;
@f = $1;
}
if($line =~ /(\d{1,3}\.\d*) ms/)
{
$c = $1;
@f = $1;
}
if($line =~ /((\d{1,3}\.)?\d{1,3})%/ )
{
$e = $1;
@f = $1;
}
else
{
#print "nothing\n";

}
chomp($a);
chomp($c);
chomp($d);
chomp($e);
$file=join(" ",$d,$a,$f,$c,$e);

print Result1 "$file\n";


}

close(Input1);
close(Result1);


Ausgabe:
Code: (dl )
1
2
3
4
5
6
25.0      8.74      2.93      6.126     0
50.0 8.95 3.00 4.945 0
75.0 8.93 3.00 6.434 0
100.0 8.90 2.99 4.595 0
125.0 8.95 3.00 5.325 0
150.0 8.93 3.00 4.204 0


Nun mein Problem: Ich möchte weitere Textdateien einlesen und mir die Durchschnittswerte der jeweiligen Werte ausgeben lassen...Die Ausgabe sollte also wie folgt sein:
Code: (dl )
1
2
(25.0+25)/2      (8.74+8.1)/2      (2.93+5.1)/2    6.126+3)/2    0
(50.0+40)/2 (8.95+6)/2 (3.00+3)/2 (4.945+5)/2 0


Kann mir jemand bitte sagen, wie ich es am besten programmieren kann ? Wäre eine Array Datenstruktur besser angebracht ?

Kann mir bitte jemand helfen ?

grüße,
Johnh
murphy
 2008-12-06 01:14
#116867 #116867
User since
2004-07-19
1776 Artikel
HausmeisterIn
[Homepage]
user image
Anstatt in einer Schleife nur jeweils eine Zeile aus einer Datei einzulesen, könnte man auch aus mehreren Dateien jeweils eine Zeile lesen und dann Durchschnittswerte bilden. Natürlich wäre das komfortabler und sauberer, wenn man die Funktionalität zum Lesen und Interpretieren einer Datenzeile in eine eigene Subroutine legen würde.

Überhaupt finde ich den Stil des geposteten Skriptes etwas fragwürdig: Datenstrukturen zu deklarieren, die man dann nicht benutzt, ist sinnlos (z.B. my @array) und Werte zu Arrays zuzuweisen, die nicht deklariert sind und nie wieder benutzt werden, ergibt noch weniger Sinn (z.B. @a = $1). Ich würde ganz dringen dazu raten use strict; use warnings; zu verwenden, dann fallen solche Dinge schneller auf (siehe Wiki:UseStrict).

chomp auf Daten anzuwenden, die garantiert kein Zeilenende enthalten können ist ebenfalls völlig überflüssig.

edit: Und auch beim Schließen eines Dateihandles sollte man nochmal auf Fehler überprüfen.
When C++ is your hammer, every problem looks like your thumb.
pktm
 2008-12-06 01:51
#116868 #116868
User since
2003-08-07
2921 Artikel
BenutzerIn
[Homepage]
user image
Ja, meine Skripten sahen auch so aus, bevor ich ordentlich mit strict und warnings angefangen habe. Man hat sehr schnell etwas davon.

Ich verwende gerne FileHandle zur Verarbeitung der Dateien. Und wenn du solche Werte aus den Dateien erstellst, kannst du die zusätzlich zur Ausgabe auch in einem Hash speichern. Als Schlüssel könntest du z.B. den jeweiligen Dateinamen (vllt. noch mit Pfad, damit du keine Namenskonflikte hast) verwenden, und als Wert eine komplexe Datenstruktur, die deine ganzen Werte enthält.

Mit jeder zusätzlich eingelesenen Datei merkst du dir, wieviele Dateiendu eingelesen hast, und welche Statistiken es zu einer Datei gab.

Diese Datenstruktur kannst du zum Programmende auswerten. Das bietet sich dann auch wieder ideal zum Auslagern in eine Sub an.
http://www.intergastro-service.de (mein erstes CMS :) )
FoolAck
 2008-12-06 13:08
#116871 #116871
User since
2008-05-02
69 Artikel
BenutzerIn
[default_avatar]
Wenn wir schon am nörgeln sind, hihi.
$a und $b sind globale Variablen, von denen man besser die Finger lässt. Das gibt sonst Stress mit Sort-Routinen. Generell lassen sich imho bessere Variablennamen als '$a' oder '$b' finden. Immer schön aussagekräftig. Und ich würde eine etwas augenfreundlichere Indentierung empfehlen.
/me away *swoosh*
johnh
 2008-12-07 17:00
#116918 #116918
User since
2008-10-05
23 Artikel
BenutzerIn
[default_avatar]
Vielen Dank für die Antworten...

Ich werde es mit einer subroutine programmieren..

Kann mir vielleicht jemand ein kleines Beispiel geben, wie ich es mit einer subroutine programmieren kann ?

grüße,
J
<< >> 5 Einträge, 1 Seite



View all threads created 2008-12-05 23:41.