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
201;215388;
201;48639860;48639869
201;48639870;48639879
201;48639880;48639889
201;48639890;48639899
201;5589000;
201;55890010;55890019
201;55890020;55890029
201;55890100;55890149
201;5589026;
201;5589027;
201;5589028;
201;5589029;
201;55891000;55891999
201;5589219;
201;5589400;
201;5589401;
203;7329283;
203;73297000;73297399
203;7329789;
203;7329900;
203;7329911;
203;7329922;
203;7329988;
2041;7549009;
2041;7549010;
2041;7549011;
2041;7549012;
2041;7549013;
2041;7549014;
2041;7549015;
2041;7549016;
2041;7549017;
2041;7549018;
2041;7549019;
2041;7549027;
2041;7549028;
2041;7549029;
2043;9829006;
2043;9829007;
2043;9829008;
2043;9829009;
2043;9829019;
2043;9829029;
2014-03-11T10:09:12 rostiPrinzip: http://rolfrost.de/csv_names.html
1 2
$line =~ s/^\d+//; # strip leading spaces $line = unpack "A*", $line; # Entferne Zeilenende und Leerzeichen am
201;215388;5589401;
2014-03-11T10:40:44 RaubtierIch denke, dass das für die gegebene Anforderung völlig egal ist. Es sind nur Zahlen, daher reicht ein split zum Splitten aus (man bracht hier wohl kein CSV-Modul). Das geht auch alles in Uralt-Perl.
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
use Modern::Perl; my %data; while (<DATA>) { chomp; # newline entfernen my ($k, $v1, $v2) = split /;/; # splitte Datensatz $data{$k} //= [ $v1, $v2//0 ]; # Datenarray setzen falls noch nicht existent $data{$k}->[0] = $v1 if $v1 < $data{$k}->[0]; # setze Minimum aus erstem Wert $data{$k}->[1] = $v2 if length $v2 && $v2 gt $data{$k}->[1]; # setze Maximum aus zweitem Wert $data{$k}->[0] = $v2 if length $v2 && $v2 lt $data{$k}->[0]; # setze Minimum aus zweitem Wert $data{$k}->[1] = $v1 if length $v1 && $v1 gt $data{$k}->[1]; # setze Maximum aus erstem Wert } # Daten wieder ausgeben say join ";",$_,@{$data{$_}} for sort keys %data; __DATA__ 201;215388; 201;48639860;48639869 201;48639870;48639879 201;48639880;48639889 201;48639890;48639899 201;5589000; 201;55890010;55890019 201;55890020;55890029 201;55890100;55890149 201;5589026; 201;5589027; 201;5589028; 201;5589029; 201;55891000;55891999 201;5589219; 201;5589400; 201;5589401; 203;7329283; 203;73297000;73297399 203;7329789; 203;7329900; 203;7329911; 203;7329922; 203;7329988; 2041;7549009; 2041;7549010; 2041;7549011; 2041;7549012; 2041;7549013; 2041;7549014; 2041;7549015; 2041;7549016; 2041;7549017; 2041;7549018; 2041;7549019; 2041;7549027; 2041;7549028; 2041;7549029; 2043;9829006; 2043;9829007; 2043;9829008; 2043;9829009; 2043;9829019; 2043;9829029;
2014-03-11T12:55:29 RaubtierWas das use Modern::Perl anbelangt ist das reine Faulheit von mir. Ich schreibe aus optischen Gründen nur ungern:- use Modern::Perl --> ich würde es vermeiden, insbesondere da sich dieses Modul einfach ersetzen lässt und es unter CentOS sicher manuell nachinstalliert werden müsste - außerdem steht in der entsprechenden Doku, dass Perl 5.10 ab Sommer nicht mehr unterstützt wird. "use strict; use warnings; use feature qw(say);" tun es auch.
QuoteDer Vergleich mit < in Zeile 11 ist ein Schreibfehler, den ich übersah.- Warum vergleichst du einmal mit < und dreimal mit lt/gt?
Quote- Mir ist nicht klar, ob das Programm die Anforderungen erfüllt (weil mir die Anforderungen nicht klar sind) - woraus schließt du anhand des Beispiels, dass hier irgendwo Minimum und Maximum gefragt sind? Es steht da etwas von "anhand der ersten Zahl sortieren". Meine Vermutung war, dass die erste und letzte Zeile wichtig sind, aber wissen tun wir es nicht.
- die fehlt ein ; in der Ausgabe (am Ende jeder Zeile) - noch etwas, das mich stutzig werden lässt, wie die Anforderung denn nun genau ist
- was soll passieren, wenn es eine Zeile nur einmal gibt?
- was soll eigentlich die dritte Zahl (sofern vorhanden)?