Leser: 1
|< 1 2 >| | 12 Einträge, 2 Seiten |
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
# Datei a öffnen
open(my$in, '<', $infile) or
die "Datei '$infile' konnte nicht geoeffnet werden: $!";
# ist Datei a zu groß um ihren Inhalt zu speichern,
# direkt Datei b öffnen
open(my$out, '>>', $outfile) or
die "Datei '$outfile' konnte nicht geoeffnet werden: $!";
# den Inhalt von Datei a an Datei b anhängen
while (<$in>)
{ print $out $_ }
# Datei b schließen
close($out);
# Datei a schließen
close($in);
QuoteRückst du deinen Code immer so sinngemäß ein?
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
#!/usr/bin/perl; use strict; use warnings; my $infile='/pfad/zur/datei.in.txt'; my $outfile='/pfad/zur/datei.out.txt'; my $data=''; # Alte daten lesen { local $/=undef; open(my $out_fh, '<', $outfile) or die "Konnte $outfile nicht öffnen ($!)\n"; $data=<$out_fh>; close ($out_fh); } # die letzten 5 Datansätze herauslesen # erst die Daten am Datum auteilen, # dann die letzten 5 Einträge herausholen, # wenn die Liste lang genug ist. # Dann die Einträge wieder vereinen. my @liste=split(/(?<=20\d{4})/s,$data); @liste=@liste[-6..-1] if(@liste>5); $data=join('',@liste); # Neue Daten holen # und anhängen. { local $/=undef; open(my $in_fh, '<', $infile) or die "Konnte $infile nicht öffnen ($!)\n"; $data.=<$in_fh>; close ($in_fh); } # Datensatz speichern # und dabei die alten Daten überschreiben. open(my $out_fh, '>', $outfile) or die "Konnte $outfile nicht öffnen ($!)\n"; print $out_fh $data; close ($out_fh);
QuoteIn der großen Datei sollen nur die Daten der letzten 5 wochen drin sein.
Am Ende jedes Eintrags steht die Woche...zum Beispiel 200701 für die erste, 200702 für die zweite Woche 2007.
Wie könnte ich es organisieren, dass alle Einträge herausfallen die älter sind als die letzten 5 Wochen?
BlueSky
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
#!/usr/bin/perl
use strict;
use warnings;
use POSIX qw/strftime/; # fuer Monat und Jahr
my $maxalter = 5; # maximales Alter in Wochen
my $gesamtdaten = 'alldata.dat';
my $neuedaten = 'newdata.dat';
my $backupsuffix = '.bak'; # Suffix fuer Backup der Daten
my $backupdaten = $gesamtdaten.$backupsuffix;
my $tmpsuffix = '.tmp'; # Suffix fuer temp. Datei
my $tmpdaten = $gesamtdaten.$tmpsuffix;
# Aktuelles Jahr und Woche ermitteln (Jahr vierstellig und Woche nach ISO 8601:1988)
my $jahrwoche = strftime ("%Y%V", localtime);
# Temporaere Datei fuer Ausgabe oeffnen
open my $tmpdaten_fh, '>', $tmpdaten
or die "Kann $tmpdaten nicht zum Schreiben oeffnen: $!";
# Alte Daten kopieren
open my $gesamtdaten_fh, '<', $gesamtdaten
or die "Kann $gesamtdaten nicht zum Lesen oeffnen: $!";
while (my $line = <$gesamtdaten_fh>) {
# Jahr/Woche am Zeilenende?
if ($line =~ /(\d{6})$/) {
# Zeile ueberspringen, wenn zu alt
next if $1 < $jahrwoche - $maxalter;
} else {
warn "Keine Datumsangabe am Ende von Zeile $. in $gesamtdaten, kopiere trotzdem!";
}
print $tmpdaten_fh $line;
}
close $gesamtdaten_fh or die "Kann $gesamtdaten nicht schliessen: $!";
# Neue Daten anhaengen
open my $neuedaten_fh, '<', $neuedaten
or die "Kann $neuedaten nicht zum Lesen oeffnen: $!";
print $tmpdaten_fh (<$neuedaten_fh>);
close $neuedaten_fh or die "Kann $neuedaten nicht schliessen: $!";
# Das war's mit Schreiben
close $tmpdaten_fh or die "Kann $tmpdaten nicht schliessen: $!";
# Datei mit vorhandenen Daten umbenennen (als Backup)
rename $gesamtdaten, $backupdaten
or die "Kann $gesamtdaten nicht in $backupdaten umbenennen: $!";
# Datei mit neuen Gesamtdaten in alten Namen umbenennen
rename $tmpdaten, $gesamtdaten
or die "Kann $tmpdaten nicht in $gesamtdaten umbenennen: $!";
# Ende
exit 0;
|< 1 2 >| | 12 Einträge, 2 Seiten |