Schrift
[thread]6203[/thread]

Anzahl Zeilen in Textdatei ermitteln: (Wie mache ich das am schnellsten?) (Seite 3)



<< |< 1 2 3 4 >| >> 35 Einträge, 4 Seiten
Crian
 2004-04-21 16:54
#81716 #81716
User since
2003-08-04
5866 Artikel
ModeratorIn
[Homepage]
user image
ein Alias

mit *x = *y ist @x das gleiche wie @y, $x wie $y und %x wie %y

also lass lieber die Finger davon ;-)\n\n

<!--EDIT|Crian|1082552474-->
s--Pevna-;s.([a-z]).chr((ord($1)-84)%26+97).gee; s^([A-Z])^chr((ord($1)-52)%26+65)^gee;print;

use strict; use warnings; Link zu meiner Perlseite
sri
 2004-04-21 16:59
#81717 #81717
User since
2004-01-29
828 Artikel
BenutzerIn
[Homepage] [default_avatar]
[quote=Taulmarill,21.04.2004, 14:51]ok, aber was genau ist denn jetzt ein *. im gegensatz zu $., was ja ein "normaler" scalar ist.[/quote]
Ich dachte das mit den Globs und den Bienchen hätt ich dir neulich erklärt. :-P
ptk
 2004-04-21 17:07
#81718 #81718
User since
2003-11-28
3645 Artikel
ModeratorIn
[default_avatar]
[quote=Crian,21.April.2004, 14:41]Aber 19 oder 23 Sekunden ist irgendwie beides zu lang, ich fürchte ich muss Jans Weg gehen. Das Betimmen der Dateigröße mit -s geht hoffentlich schneller.[/quote]
Also ich sehe keine Nachteile bei der Methode mit -s. Und das Ermitteln der Dateigroesse per -s duerfte im Mikrosekundenbereich liegen.
Taulmarill
 2004-04-21 17:07
#81719 #81719
User since
2004-02-19
1750 Artikel
BenutzerIn

user image
[quote=sri,21.04.2004, 14:59]Ich dachte das mit den Globs und den Bienchen hätt ich dir neulich erklärt. :-P[/quote]
ne, hast du nich, aber wenn ich weiss dass das globs sind dann is mir schon geholfen, ich kann ja lesen :-)

btw. poor mans progress bar:
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
#!/usr/bin/perl -w

use strict;

$| = 1;

my $file = "test.txt";
my $maxsize = -s $file;
my $accsize = "0";
my $accperc = "0.0125";

print " 10%| 20%| 30%| 40%| 50%| 60%| 70%| 80%| 90%| 100%|\n";

open ( F, "<$file" ) or die $!;

while (<F>) {
$accsize += length $_;
if ( $accsize / $maxsize >= $accperc ) {
print "#";
$accperc += 0.0125;
}
# inserd your code here
}

print "\n";
$_=unpack"B*",~pack"H*",$_ and y&1|0& |#&&print"$_\n"for@.=qw BFA2F7C39139F45F78
0A28104594444504400 0A2F107D54447DE7800 0A2110453444450500 73CF1045138445F4800 0
F3EF2044E3D17DE 8A08A0451412411 F3CF207DF41C79E 820A20451412414 83E93C4513D17D2B
sri
 2004-04-21 17:25
#81720 #81720
User since
2004-01-29
828 Artikel
BenutzerIn
[Homepage] [default_avatar]
[quote=Taulmarill,21.04.2004, 15:07]ne, hast du nich, aber wenn ich weiss dass das globs sind dann is mir schon geholfen, ich kann ja lesen :-)[/quote]
Oh, dann bereite dich mental schonmal auf ne gaaaanz laaaaaange Erklärung vor. :D

Btw. Code schnipsel kannst du zum erinnern unter http://oook.de?PerlSnippets hinterlegen.
Crian
 2004-04-21 17:26
#81721 #81721
User since
2003-08-04
5866 Artikel
ModeratorIn
[Homepage]
user image
hmmm fest immer + 0.0125? Kann ja nicht hinhauen...
s--Pevna-;s.([a-z]).chr((ord($1)-84)%26+97).gee; s^([A-Z])^chr((ord($1)-52)%26+65)^gee;print;

use strict; use warnings; Link zu meiner Perlseite
Taulmarill
 2004-04-21 17:34
#81722 #81722
User since
2004-02-19
1750 Artikel
BenutzerIn

user image
[quote=Crian,21.04.2004, 15:26]hmmm fest immer + 0.0125? Kann ja nicht hinhauen...[/quote]
teste es, das haut hin, weil 1 / 80 = 0,0125.
wenn du auf eine andere bildschirmbreite gehen willst bzw. diese variabel gestalten möchtest, dann musst du natürlich den faktor berechnen.
$_=unpack"B*",~pack"H*",$_ and y&1|0& |#&&print"$_\n"for@.=qw BFA2F7C39139F45F78
0A28104594444504400 0A2F107D54447DE7800 0A2110453444450500 73CF1045138445F4800 0
F3EF2044E3D17DE 8A08A0451412411 F3CF207DF41C79E 820A20451412414 83E93C4513D17D2B
sri
 2004-04-21 17:44
#81723 #81723
User since
2004-01-29
828 Artikel
BenutzerIn
[Homepage] [default_avatar]
[quote=Taulmarill,21.04.2004, 15:34][quote=Crian,21.04.2004, 15:26]hmmm fest immer + 0.0125? Kann ja nicht hinhauen...[/quote]
teste es, das haut hin, weil 1 / 80 = 0,0125.
wenn du auf eine andere bildschirmbreite gehen willst bzw. diese variabel gestalten möchtest, dann musst du natürlich den faktor berechnen.[/quote]
Bei weniger als 80 Zeilen hast du auch Probleme ;)
Crian
 2004-04-21 17:49
#81724 #81724
User since
2003-08-04
5866 Artikel
ModeratorIn
[Homepage]
user image
stimmt :-D


Ich hab auch nochmal gebenchmarked mit komischem Ergebnis:

Code: (dl )
1
2
3
4
5
6
7
C:\Daten\perl>benchmark.pl
Benchmark: timing 100 iterations of A, A2, C, D...
A: 307 wallclock secs (272.94 usr + 27.55 sys = 300.49 CPU) @ 0.33/s (n=100)
A2: 316 wallclock secs (278.64 usr + 24.92 sys = 303.56 CPU) @ 0.33/s (n=100)
C: 333 wallclock secs (278.80 usr + 23.83 sys = 302.63 CPU) @ 0.33/s (n=100)
D: 0 wallclock secs ( 0.00 usr + 0.00 sys = 0.00 CPU)
(warning: too few iterations for a reliable count)


Der Code dazu:

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
#!/usr/bin/perl
use strict;
use warnings;
use Benchmark;

my $file = 'test.txt';

timethese(100, {
A => sub {
open ( FILE, $file );
my $ln;
$ln++ while <FILE>;
close (FILE);
},

A2 => sub {
my $ln;
open ( FILE, $file );
++$ln while <FILE>;
close (FILE);
},
# ist unter C ein Unterschied, spart temporäre Variable...

#B => sub {
# open ( FILE, $file );
# my @array;
# my $ln = scalar(@array = <FILE>);
# close (FILE);
# },

C => sub {
open ( FILE, $file );
while ( <FILE> ) {}
my $ln = $.;
close (FILE);
},

D => sub {
my $ln = -s $file;
},
}
);

# test.txt hat 3.804.144 Zeilen und ist 195.338.421 Byte groß


Bei B hat er so wild angefangen zu swappen, dass ich die Variante rausgeworfen habe.

-s geht rasant schnell... hmmm da muss ich doch wohl in den saueren Apfel beißen und die Zeichen jeder Zeile ermitteln...
s--Pevna-;s.([a-z]).chr((ord($1)-84)%26+97).gee; s^([A-Z])^chr((ord($1)-52)%26+65)^gee;print;

use strict; use warnings; Link zu meiner Perlseite
Taulmarill
 2004-04-21 17:54
#81725 #81725
User since
2004-02-19
1750 Artikel
BenutzerIn

user image
[quote=sri,21.04.2004, 15:44][quote=Taulmarill,21.04.2004, 15:34]
teste es, das haut hin, weil 1 / 80 = 0,0125.
wenn du auf eine andere bildschirmbreite gehen willst bzw. diese variabel gestalten möchtest, dann musst du natürlich den faktor berechnen.[/quote]
Bei weniger als 80 Zeilen hast du auch Probleme ;)[/quote]
weniger als 80 zeichen fällt bei mir unter "andere bildschirmbreite" da <80 != 80.
mir war lediglich langweilig, da hab ich das gebaut und dachte mir ich poste es mal.

achso, und wenn wir schon beim klugscheissen sind
[quote=sri,21.04.2004, 14:59]Ich dachte das mit den Globs und den Bienchen hätt ich dir neulich erklärt. :-P[/quote]
das waren keine globs sondern typeglobs. wie so häufig sind deine antworten destruktiv ;-)
$_=unpack"B*",~pack"H*",$_ and y&1|0& |#&&print"$_\n"for@.=qw BFA2F7C39139F45F78
0A28104594444504400 0A2F107D54447DE7800 0A2110453444450500 73CF1045138445F4800 0
F3EF2044E3D17DE 8A08A0451412411 F3CF207DF41C79E 820A20451412414 83E93C4513D17D2B
<< |< 1 2 3 4 >| >> 35 Einträge, 4 Seiten



View all threads created 2004-04-21 11:58.