Schrift
Wiki:Tipp zum Debugging: use Data::Dumper; local $Data::Dumper::Useqq = 1; print Dumper \@var;
[thread]7325[/thread]

Durchschnittserrechnung: Daten aus Datei einlesen, Durchschnitt



<< |< 1 2 >| >> 13 Einträge, 2 Seiten
Mimo
 2005-10-11 11:10
#58596 #58596
User since
2005-10-11
5 Artikel
BenutzerIn
[default_avatar]
Hallo zusammen,

ich bin totaler Perl n00b! Genug zu mir.
Meine Frage: Wie kann ich aus einer Textdatei den Durchschnitt errechnen lassen?

Folgende Infos sind in der Textdatei:

08/10/2005 21:05:11 channel #info users 2
09/10/2005 14:06:48 channel #info users 2
09/10/2005 22:21:52 channel #info users 2
09/10/2005 23:24:27 channel #info users 2

Anzahl der Zeilen ( channel ) / Summer (users) .

Ich hoffe, mir kann einer weiterhelfen und mir den code zeigen.

Greetz

Mimo
Ishka
 2005-10-11 11:45
#58597 #58597
User since
2003-08-04
771 Artikel
HausmeisterIn
[Homepage] [default_avatar]
Zum Beispiel so:
Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
my ($benutzer, $zeilen, $datei)=();
open $datei, "<$dateipfad";
while(<$datei>)
{
m/ #info users (\d+)/ || next;
$benutzer+=$1;
$zeilen++;
}
close $datei;

print $benutzer/$zeilen;

(ungetestet)

Wenn du Fragen dazu hast, frag einfach.
sub z{if(@_){1while$x[$k=rand 10];t($t=$x[$k]=1)}print map"$z[$x[$_]]$_".($_%3?
"":"\n"),1..9}sub t{$j=0;$x[$_+1]==$t&&($j+=2**$_)for 0..8;z,die"Gewinner $z[$t]
"if grep$_==($j&$_),7,56,73,84,146,273,292,448;z,die"Gleichstand\n"if@x>9&&!grep
!$_,@x}@x=4;@z=qw{. [ (};z$^T&1;while(<>){next if$_>9||$x[$_];t$t=$x[$_]=2;z 1}
murphy
 2005-10-11 14:46
#58598 #58598
User since
2004-07-19
1776 Artikel
HausmeisterIn
[Homepage]
user image
Aber bitte Dateien immer mit Fehlerabfrage öffnen:
Code (perl): (dl )
1
2
open $datei, '<', $dateiname
    or die "$dateiname konnte nicht geoeffnet werden: $!"


(edit: syntaxhiglighting gefixt)\n\n

<!--EDIT|murphy|1129027769-->
When C++ is your hammer, every problem looks like your thumb.
Strat
 2005-10-11 17:51
#58599 #58599
User since
2003-08-04
5246 Artikel
ModeratorIn
[Homepage] [default_avatar]
nebenbei: bei einer while (<...>) - schleife kann man sich $zeilen++ auch sparen; in der speziellen Perl-Variable namens $. steht die zeilennummer der zuletzt gelesenen zeile

Code: (dl )
1
2
3
4
5
6
7
open (my $fh, "<", $dateiPfad) or die $!;
my $benutzer = 0;
while (<$fh>) {
$benutzer += $1 if /#info users (\d+)/;
} # while
print $benutzer/$.;
close $datei;

(funktioniert allerdings leicht anders als das von ishka, weil bei ihm Zeilen uebersprungen werden, wenn das muster nicht matcht.\n\n

<!--EDIT|Strat|1129040093-->
perl -le "s::*erlco'unaty.'.dk':e,y;*kn:ai;penmic;;print"
http://www.fabiani.net/
murphy
 2005-10-11 18:06
#58600 #58600
User since
2004-07-19
1776 Artikel
HausmeisterIn
[Homepage]
user image
Allerdings hätte ich sowieso diese Lösung vorgeschlagen:
Code: (dl )
1
2
3
4
5
{ local $/; $_ = <>; }
@_ = /users\s+(\d+)/g;
$a = 0;
$a += $_/@_ for (@_);
print "$a\n";

;)

(edit: den kampf mit PERL tags aufgegeben)\n\n

<!--EDIT|murphy|1129039775-->
When C++ is your hammer, every problem looks like your thumb.
Strat
 2005-10-11 18:13
#58601 #58601
User since
2003-08-04
5246 Artikel
ModeratorIn
[Homepage] [default_avatar]
@murphy: als obfu recht nett, aber in praxis wohl besser nicht verwenden.
$a und $b sollten fuer sort reserviert bleiben
das erste $_ und @_ sollte man besser mit local deklarieren, damit man sich nicht unnoetigerweise die globalen variablen veraendert (ok, bei der uebergabeparameterliste geht wohl selten was schief, aber bei $_ kann da schon was nettes passieren)
was passiert, wenn die datei 3 GB gross ist?
perl -le "s::*erlco'unaty.'.dk':e,y;*kn:ai;penmic;;print"
http://www.fabiani.net/
Mimo
 2005-10-11 20:13
#58602 #58602
User since
2005-10-11
5 Artikel
BenutzerIn
[default_avatar]
Danke für die Antworten.
Jetzt will ich das ganze über einen Perl IRC Bot machen siehe code:

Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
 
if ($arg =~ /^!average (.*)/i ) {
chdir("pfad zum ornder wo text datein gespeichert sind");
if ( $1) {
my $dateiPfad = $1;
my ($benutzer, $zeilen, $datei)=();
open $datei, "<$dateiPfad";
while(<$datei>)
{
m/ users (\d+)/ || next;
$benutzer+= $_;
$zeilen++;
}
close $datei;

$self->privmsg([ @to ], " $benutzer/$zeilen " );

}
}


Ergebnis:

.:17:58:15:. « Me » !average #webmasters.txt
.:17:58:15:. « PerlBot » /


Das heisst, ich gebe ein: "!average channel.txt" und möchte den Durchschnitt angezeigt bekommen. Nur liegt das Problem daran, das ich $1 für die eingabe im channel brauche ( ich nutze NET::IRC).

Vielen dank schonmal.

Greetz
Mimo
renee
 2005-10-11 23:33
#58603 #58603
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
Was meinst Du mit $1 brauchst Du für die Eingabe??
OTRS-Erweiterungen (http://feature-addons.de/)
Frankfurt Perlmongers (http://frankfurt.pm/)
--

Unterlagen OTRS-Workshop 2012: http://otrs.perl-services.de/workshop.html
Perl-Entwicklung: http://perl-services.de/
Strat
 2005-10-12 01:11
#58604 #58604
User since
2003-08-04
5246 Artikel
ModeratorIn
[Homepage] [default_avatar]
Code: (dl )
1
2
3
4
if ($arg  =~ /^!average (.*)/i ) {
chdir("pfad zum ornder wo text datein gespeichert sind");
if ( $1) {
my $dateiPfad = $1;

ist doppelt gemoppelt, und $1 usw. immer direkt nach dem match abfragen... z.B.
Code: (dl )
1
2
if (my ($dateiPfad) = $arg  =~ /^!average (.*)/i ) {
chdir("pfad zum ornder wo text datein gespeichert sind");

oder
Code: (dl )
1
2
3
if ($arg  =~ /^!average (.*)/i ) {
my $dateiPfad = $1;
chdir("pfad zum ornder wo text datein gespeichert sind");
perl -le "s::*erlco'unaty.'.dk':e,y;*kn:ai;penmic;;print"
http://www.fabiani.net/
Mimo
 2005-10-12 01:22
#58605 #58605
User since
2005-10-11
5 Artikel
BenutzerIn
[default_avatar]
Oh mann sorry ich habs.....

der pfad zum ordner war falsch ...

Danke nochmal an alle

Greetz

Mimo
<< |< 1 2 >| >> 13 Einträge, 2 Seiten



View all threads created 2005-10-11 11:10.