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
#N:\...\Auswertung
$input_directory = "C:\\Answ...TI\\";
$output_directory = "N:\\e...ertung\\";
$output_filename = "ergebnisse.txt";
@input_filenames = (
'2ds.VD',
'2ds-csp.VD',
'2ds-cspswh.VD',
'2ds-swh.VD',
'4ds.VD',
'4ds-csp.VD',
'6ds.VD',
'6ds-csp.VD',
);
# prepare output file
open OUTFILE, ">", $output_directory.$output_filename or die "Cannot open FILE $output_filename in $output_directory.\n";
# foreach input file, open it, and process
foreach $file (@input_filenames) {
# Get the scenario ID, ie. the first part of the filename up to the .
$scenario_id = $file;
$scenario_id =~ s/\..+//;
print "# Szenario_ID: $scenario_id\n";
open INFILE, "<", $input_directory.$file or die "Cannot open INFILE $file in $input_directory.\n";;
$cnt = 0;
$line = <INFILE>;
chomp $line;
while ($line = <INFILE>) {
if ($line =~ m/^\*/) { $cnt++; next; }
if ($line =~ m/^\s+/) { $cnt++; next; }
print OUTFILE "\"$scenario_id\",".$line;
}
close INFILE;
}
# close output file
close OUTFILE;
2014-12-19T09:50:58 rosti... Wenn Du jedoch weißt, wieviele (wenige) Zeilen am Anfang übersprungen werden müssen, ...
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
use strict; use warnings; use IO::File; my @files = qw(adressen.txt); my $fh_in = IO::File->new; # Ergebnis Datei my $fh_out = IO::File->new; $fh_out->open('result.txt', O_CREAT|O_RDWR) or die "IO-Error: $!"; foreach my $file(@files){ $fh_in->open($file, 'r') or die $!; my $fstline = <$fh_in>; # first line skip my $offset = $fh_in->tell; # brauchen wir das?, Nö # Rest der Datei von $fh_in nach $fh_out while( read( $fh_in, my $buffer, 1024 ) ){ $fh_out->print($buffer); } $fh_in->close; } $fh_out->close;
2014-12-19T09:50:58 rostiIch denke, die Zerlegung in Zeilen dürfte unvermeidbar sein, wenn weiterhin – wie im ursprünglichen Script – gewünscht ist, dass die Zeilen in der Zieldatei einzeln (mit der $scenario_id) präfigiert werden. Es handelt sich ja offenbar um eine Art CSV.Ja, die Zerlegung in Zeilen kostet CPU.
print OUTFILE "\"$scenario_id\",".$line;
Quote◾ Die Zeilen 39 $cnt = 0; ... sind überflüssig, wenn das hier das vollständige Script ist.
2014-12-19T09:12:27 payx, wenn das hier das vollständige Script ist.
1 2
if ($line =~ m/^\*/) { $cnt++; next; } if ($line =~ m/^\s+/) { $cnt++; next; }
1 2
my $c = substr($line,0,1); next if( $c eq '*' or $c eq ' ' or $c eq "\t" or $c eq "\r" or $c eq "\n");
1 2 3 4 5 6 7 8 9 10 11 12 13 14
my $text = "foo"; sub SUBSTR { my $c = substr $text, 0, 1; return ( $c eq "*" or $c eq " " or $c eq "\t" or $c eq "\r" or $c eq "\n" ); } sub REGEX { return ($text =~ m/^\*/ || $text =~ m/^\s+/); } use Benchmark; timethese(5000000, { substr => \&SUBSTR, regex => \®EX }) __END__ Benchmark: timing 5000000 iterations of regex, substr... regex: 2 wallclock secs ( 1.07 usr + 0.00 sys = 1.07 CPU) @ 4672897.20/s (n=5000000) substr: 1 wallclock secs ( 1.38 usr + 0.00 sys = 1.38 CPU) @ 3623188.41/s (n=5000000)
1 2 3 4 5 6
my $data; while (read(DATA, my $d, 1024 * 1024 * 10)) { # 10mb $data .= $d; } my @lines = $data =~ /^[^\s\*].*$/gm;