1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
use DateTime; my $line = "14.01.2013 23:55;Messwert1;Messwert2;"; my ($D,$M,$Y,$h,$m,$rest) = $line =~ m/^(\d\d)\.(\d\d)\.(\d\d\d\d)\s(\d\d):(\d\d)(;.+)$/; my $dt = DateTime->new( year => $Y, month => $M, day => $D, hour => $h, minute => $m, second => 0, time_zone => 'Europe/Berlin', ); $dt->set_time_zone('UTC'); #print $dt->strftime('%d.%m.%Y %H:%M'); # Ausgabe nur mit anderer Zeitzone $line = $dt->strftime('%d.%m.%Y %H:%M') . $rest;
2013-11-28T11:50:47 MuffiJa, die Raltion spielt nicht nur bei dir eine Rolle.Stimmt ;)
Aber bei mir ist das ein Kosten/Nutzen-Verhältnis.
QuoteIch denke, das hat viel Overhead. Aber wenn's modern sein soll, ist's sinnvoll.Und ob dieses Modul so viel Nutzen beim simplen Einlesen von Dateien bringt...
Quoteja, ich erschrak auch kurz ob dieser C++-Syntax. Und obs dann irgendwelche späteren Mitarbeiter mitbekommen, dass die Syntax nur für das Modul gilt, bezweifele ich dann doch.Dafür führts recht Perl-untypische Syntax ein und mindert dadurch die Wartbarkeit.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
use DateTime; use IO::All; $temp < io($file); sub conv_dt { my ($Day,$Month,$Year,$Hour,$Minute) = @_; my $dt = DateTime->new( year => $Year, month => $Month, day => $Day, hour => $Hour, minute => $Minute, second => 0, time_zone => 'Europe/Berlin', ); $dt->set_time_zone('UTC'); return $dt->strftime('%d.%m.%Y %H:%M'); } # ersetze alle Matches durch das Ergebnis von conv_dt in einem Multiline-zeichenkette $temp =~ s/^(\d\d)\.(\d\d)\.(\d\d\d\d)\s(\d\d):(\d\d)/conv_dt($1,$2,$3,$4,$5)/egm; $temp > io($file);
1
2
3
4
5
6
7
8
9
10
11
12
Name "main::Hour" used only once: possible typo at SDE_Skript.pl line 68
Name "main::Minute" used only once: possible typo at SDE_Skript.pl line 68
Name "main::D" used only once: possible typo at SDE_Skript.pl line 72
Name "main::M" used only once: possible typo at SDE_Skript.pl line 71
Name "main::part" used only once: possible typo at SDE_Skript.pl line 26
Name "main::Year" used only once: possible typo at SDE_Skript.pl line 68
Name "main::Day" used only once: possible typo at SDE_Skript.pl line 68
Name "main::m" used only once: possible typo at SDE_Skript.pl line 74
Name "main::Y" used only once: possible typo at SDE_Skript.pl line 70
Name "main::h" used only once: possible typo at SDE_Skript.pl line 73
Name "main::Month" used only once: possible typo at SDE_Skript.pl line 68
Use of uninitialized value $_ in substitution (s///) at SDE_Skript.pl line 82
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
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
#!/usr/bin/perl -w
use DateTime;
use FindBin;
use IO::All;
use File::Find;
use Fcntl ':mode';
$path="/home/chris/Arbeitsfläche/SDE_HIK_Skripte"; # Pfad in dem alles beginnt
@directories=("$path/SDE-Rohdaten"); # Liste der zu durchlaufenden Verzeichnisse (hier nur eines)
$datum="2013"; # Suchoption: Jeder Dateiname mit diesem Inhalt wird aufgelistet.
find(\&wanted, @directories);
sub wanted {
if (-f && $File::Find::name =~ /.*$datum.*\.csv/) { # Hier das Kriterium nach dem Dateien gesucht werden
my @stats = lstat($File::Find::name);
push(@copy_files,$File::Find::name); # schreibt alle gefundenen Dateien in @copy_files
}
}
foreach $file (@copy_files) {
$part = $file;
# $part =~ s/^(.*\/).*$/\1/g; # Das ist keine Magie.... ;-) Hier wird lediglich der Dateipfad extrahiert :-P
chdir $FindBin::Bin; # Wechselt in das Verzeichnis in dem sich das ausgeführte Skript befindet (da liegt auch die Datei)
$temp < io("$file"); # Schreibt die Datei in $temp
while ($temp =~s/"Messpunkt";//g) {} # Entfernt >> "Messpunkt"; <<
while ($temp =~s/"\d{5,}";//g) {} # Entfernt die fortlaufenden Messpunktnummern inkl. Semicolon, Zahl hat mind. 5 Stellen
while ($temp =~s/["()]//g) {} # Entfernt alle >> "() << Zeichen (Anführungszeichen und Klammern)
$temp =~s/Item 1/620.0.HW.TS.Tvl/; # Hier werden die "Item 1 - 25" in die entsprechenden Mess-IDs umgewandelt
$temp =~s/Item 2/620.0.HW.TS.Trl/;
$temp =~s/Item 3/620.0.0.TS.AUL/;
$temp =~s/Item 4/620.0.EW.TS.1/;
$temp =~s/Item 5/620.0.EW.TS.2/;
$temp =~s/Item 6/620.0.EW.TS.3/;
$temp =~s/Item 7/620.0.EW.TS.4/;
$temp =~s/Item 8/620.0.0.TS.1/;
$temp =~s/Item 9/620.0.0.TS.2/;
$temp =~s/Item 10/620.0.0.RH.1/;
$temp =~s/Item 11/620.0.0.RH.2/;
$temp =~s/Item 12/620.0.0.CO2/;
$temp =~s/Item 13/620.0.FW.ES/;
$temp =~s/Item 14/620.0.FW.RV/;
$temp =~s/Item 15/620.0.HW.ES/;
$temp =~s/Item 16/620.0.HW.TS.Soll/;
$temp =~s/Item 17/620.0.EW.TS.Trl/;
$temp =~s/Item 18/620.0.KM.TS.Tvl/;
$temp =~s/Item 19/620.0.KM.TS.Trl/;
$temp =~s/Item 20/620.0.LA.TS.Trl/;
$temp =~s/Item 21/620.0.EW.ES/;
$temp =~s/Item 22/620.0.KM.ES/;
$temp =~s/Item 23/620.0.LA.ES/;
$temp =~s/Item 24/620.0.KM.TS.Soll/;
$temp =~s/Item 25/620.0.LA.TS.Soll/;
sub conv_dt {
($Day, $Month, $Year, $Hour, $Minute) = @_;
$dt = DateTime->new(
year => $Y,
month => $M,
day => $D,
hour => $h,
minute => $m,
second => 0,
time_zome => 'Europe/Berlin',
);
$dt->set_time_zone('UTC');
return $dt->strftime('%d.%m.%Y %H:%M');
}
$temp = ~s/^(\d\d)\.(\d\d)\.(\d\d\d\d)\s(\d\d):(\d\d)/conv_dt($1,$2,$3,$4,$5)/egm;
$file =~s/.csv/_SDE_UTC.csv/; # Erweiterung des Dateinamen um "_SDE_UTC". Testdateiname: Report-20131025-0010.skv
$temp >> io("$file"); # Änderungen werden in Datei gespeichert
}
2013-11-28T09:26:13 GwenDragonCode (perl): (dl )1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24use DateTime; use IO::All; $temp < io($file); sub conv_dt { my ($Day,$Month,$Year,$Hour,$Minute) = @_; my $dt = DateTime->new( year => $Year, month => $Month, day => $Day, hour => $Hour, minute => $Minute, second => 0, time_zone => 'Europe/Berlin', ); $dt->set_time_zone('UTC'); return $dt->strftime('%d.%m.%Y %H:%M'); } # ersetze alle Matches durch das Ergebnis von conv_dt in einem Multiline-zeichenkette $temp =~ s/^(\d\d)\.(\d\d)\.(\d\d\d\d)\s(\d\d):(\d\d)/conv_dt($1,$2,$3,$4,$5)/egm; $temp > io($file);
Use of uninitialized value $_ in substitution (s///) at SDE_Skript.pl line 82
$temp =~ s/^(\d\d)\.(\d\d)\.(\d\d\d\d)\s(\d\d):(\d\d)/conv_dt($1,$2,$3,$4,$5)/egm;
$temp =~ s/^(\d\d)\.(\d\d)\.(\d\d\d\d)\s(\d\d):(\d\d)/conv_dt($1,$2,$3,$4,$5)/egm
1 2
$temp =~ s/^(\d\d)\.(\d\d)\.(\d\d\d\d)\s(\d\d):(\d\d)/conv_dt($1,$2,$3,$4,$5)/egm if $temp =~ m/^(\d\d)\.(\d\d)\.(\d\d\d\d)\s(\d\d):(\d\d)/;
2013-11-28T12:55:28 GwenDragonVielleicht hilft es anstattdas zu verwendenCode (perl): (dl )$temp =~ s/^(\d\d)\.(\d\d)\.(\d\d\d\d)\s(\d\d):(\d\d)/conv_dt($1,$2,$3,$4,$5)/egmCode (perl): (dl )1 2$temp =~ s/^(\d\d)\.(\d\d)\.(\d\d\d\d)\s(\d\d):(\d\d)/conv_dt($1,$2,$3,$4,$5)/egm if $temp =~ m/^(\d\d)\.(\d\d)\.(\d\d\d\d)\s(\d\d):(\d\d)/;
1 2
$temp =~ s/^(\d\d)\.(\d\d)\.(\d\d\d\d)\s(\d\d):(\d\d)/conv_dt($1,$2,$3,$4,$5)/egm if $temp =~ m/^(\d\d)\.(\d\d)\.(\d\d\d\d)\s(\d\d):(\d\d)/;
$temp =~ s/^(\d\d)\.(\d\d)\.(\d\d\d\d)\s(\d\d):(\d\d)/conv_dt($1,$2,$3,$4,$5)/egm if $temp =~ m/^(\d\d)\.(\d\d)\.(\d\d\d\d)\s(\d\d):(\d\d)/;
if ($temp =~ m/^(\d\d)\.(\d\d)\.(\d\d\d\d)\s(\d\d):(\d\d)/) { $temp =~ s/^(\d\d)\.(\d\d)\.(\d\d\d\d)\s(\d\d):(\d\d)/conv_dt($1,$2,$3,$4,$5)/egm }
2013-11-28T16:47:03 GwenDragonIch finde so einen langen Wurm schlecht zu lesen ...
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
#!/usr/bin/perl use 5.008; use strict; use warnings; use DateTime; use IO::All; my $file = 'test.log'; my $temp < io($file); sub conv_dt { my ($Day,$Month,$Year,$Hour,$Minute) = @_; my $dt = DateTime->new( year => $Year, month => $Month, day => $Day, hour => $Hour, minute => $Minute, second => 0, time_zone => 'Europe/Berlin', ); $dt->set_time_zone('UTC'); return $dt->strftime('%d.%m.%Y %H:%M'); } $temp =~ s/^(\d\d)\.(\d\d)\.(\d\d\d\d)\s(\d\d):(\d\d)/conv_dt($1,$2,$3,$4,$5)/egm if $temp =~ /^(\d\d)\.(\d\d)\.(\d\d\d\d)\s(\d\d):(\d\d)/; $temp > io("$file-out.log");
1
2
3
4
5
6
7
8
9
10
11
12
13
14.01.2013 17:55;Messwert1;Messwert2;
14.01.2013 18:55;Messwert1;Messwert2;
14.01.2013 19:55;Messwert1;Messwert2;
14.01.2013 20:55;Messwert1;Messwert2;
14.01.2013 21:55;Messwert1;Messwert2;
14.01.2013 22:55;Messwert1;Messwert2;
14.01.2013 23:55;Messwert1;Messwert2;
15.01.2013 00:55;Messwert1;Messwert2;
15.01.2013 01:55;Messwert1;Messwert2;
15.01.2013 02:55;Messwert1;Messwert2;
15.01.2013 03:55;Messwert1;Messwert2;
15.01.2013 04:55;Messwert1;Messwert2;
15.01.2013 05:55;Messwert1;Messwert2;
1
2
3
4
5
6
7
8
9
10
11
12
13
14.01.2013 16:55;Messwert1;Messwert2;
14.01.2013 17:55;Messwert1;Messwert2;
14.01.2013 18:55;Messwert1;Messwert2;
14.01.2013 19:55;Messwert1;Messwert2;
14.01.2013 20:55;Messwert1;Messwert2;
14.01.2013 21:55;Messwert1;Messwert2;
14.01.2013 22:55;Messwert1;Messwert2;
14.01.2013 23:55;Messwert1;Messwert2;
15.01.2013 00:55;Messwert1;Messwert2;
15.01.2013 01:55;Messwert1;Messwert2;
15.01.2013 02:55;Messwert1;Messwert2;
15.01.2013 03:55;Messwert1;Messwert2;
15.01.2013 04:55;Messwert1;Messwert2;
1
2
3
Datum;Messwert1;Messwert2;Messwert3
12.2.2013 22:23;12,5;2,8;5,0
12.2.2013 22:22;11,5;5,6;5,1
$temp =~ s/^(\d\d)\.(\d\d)\.(\d\d\d\d)\s(\d\d):(\d\d)/conv_dt($1,$2,$3,$4,$5)/egm;
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
use DateTime;
use IO::All;
$temp < io("$file");
sub conv_dt {
($Day, $Month, $Year, $Hour, $Minute) = @_;
$dt = DateTime->new(
year => $Year,
month => $Month,
day => $Day,
hour => $Hour,
minute => $Minute,
second => 0,
time_zome => 'Europe/Berlin',
);
$dt->set_time_zone('UTC');
return $dt->strftime('%d.%m.%Y %H:%M');
}
$temp =~ s/^(\d\d)\.(\d\d)\.(\d\d\d\d)\s(\d\d):(\d\d)/conv_dt($1,$2,$3,$4,$5)/egm;
# if $temp =~ m/^(\d\d)\.(\d\d)\.(\d\d\d\d)\s(\d\d):(\d\d)/;
$file =~ s/.csv/_SDE_UTC.csv/; # Erweiterung des Dateinamen um "_SDE_UTC". Testdateiname: Report-20131025-0010.skv
$temp >> io("$file"); # Änderungen werden in Datei gespeichert
}
$temp =~ s/^(\d\d?)\.(\d\d?)\.(\d\d\d\d)\s(\d\d):(\d\d)/conv_dt($1,$2,$3,$4,$5)/egm;
$temp =~ s/^(\d{1,2})\.(\d{1,2})\.(\d\d\d\d)\s(\d\d):(\d\d)/conv_dt($1,$2,$3,$4,$5)/egm;
2013-11-29T14:00:36 SpeedriffSchön. Wenn das Problem gelöst ist gibt es oben neben dem Titel des Threads einen Butoon zum gelöst-markieren.ja, jetzt funktioniert es!
QuoteHattest du aber in msg #172287 hattest du so eine Datei.was meinst du mit einstellig? etwas sowas wie 1.1.2013 statt 01.01.2013?
das kommt soweit ich das bisher gesehen habe auch nicht so vor..
QuoteJa, so geht's auch.Code: (dl )$temp =~ s/^(\d{1,2})\.(\d{1,2})\.(\d\d\d\d)\s(\d\d):(\d\d)/conv_dt($1,$2,$3,$4,$5)/egm;
2013-11-28T12:55:28 GwenDragonVielleicht hilft es anstattdas zu verwendenCode (perl): (dl )$temp =~ s/^(\d\d)\.(\d\d)\.(\d\d\d\d)\s(\d\d):(\d\d)/conv_dt($1,$2,$3,$4,$5)/egmCode (perl): (dl )1 2$temp =~ s/^(\d\d)\.(\d\d)\.(\d\d\d\d)\s(\d\d):(\d\d)/conv_dt($1,$2,$3,$4,$5)/egm if $temp =~ m/^(\d\d)\.(\d\d)\.(\d\d\d\d)\s(\d\d):(\d\d)/;
$x =~ s/foo/bar/ if $x =~ m/foo/;
2013-11-28T12:47:58 Speedriffwäre damit zu erledigen :(Mein Fehler!
Das hattest du im ersten Skript so geschrieben, habe es falsch übernommen...
Die Fehlermeldungen sind bis auf eine weg:
Code: (dl )Use of uninitialized value $_ in substitution (s///) at SDE_Skript.pl line 82
So gesehen wäre der Fehler hier drin:
Code: (dl )$temp =~ s/^(\d\d)\.(\d\d)\.(\d\d\d\d)\s(\d\d):(\d\d)/conv_dt($1,$2,$3,$4,$5)/egm;
$temp = ~s/^(\d\d)\.(\d\d)\.(\d\d\d\d)\s(\d\d):(\d\d)/conv_dt($1,$2,$3,$4,$5)/egm;
$file =~s/.csv/_SDE_UTC.csv/;
1
2
3
4
5
$ perl -wle '$a="text"; $a = ~s/x/s/; print $a;'
Use of uninitialized value $_ in substitution (s///) at -e line 1.
4294967295
$ perl -wle '$a="text"; $a =~ s/x/s/; print $a;'
test