Thread 2 Textdateien mergen: anfänger problem (11 answers)
Opened by Gast at 2007-03-17 12:21

Dubu
 2007-03-26 16:13
#75099 #75099
User since
2003-08-04
2145 Artikel
ModeratorIn + EditorIn

user image
[quote=BlueSky,23.03.2007, 14:49]allerdings würde ich gern noch etwas ändern und ich bin mir nicht sicher, ob das geht.
[/quote]
Och, in Perl geht vieles.

Quote
In 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

Das sollte es machen:
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
#!/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;


Edit: code-Tags statt perl-Tags\n\n

<!--EDIT|Dubu|1174917139-->

View full thread 2 Textdateien mergen: anfänger problem