Thread Macintosh Dateien unter Win in Perl einlesen! (30 answers)
Opened by Weman at 2005-09-20 12:57

Crian
 2005-09-26 15:28
#58268 #58268
User since
2003-08-04
5873 Artikel
ModeratorIn
[Homepage]
user image
So, ich hab mal folgendes Programm geschrieben, allerdings weiß ich natürlich nicht, in wie weit das abhängig ist von den spezifischen Dingen in dieser Datei. Für diese tut es was es soll :)

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
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
#!/usr/bin/perl
use strict;
use warnings;

use IO::File;

main();


sub main {
my $file = '85635.txt';

my $fh = new IO::File "< $file" or die "Can't open file '$file': $!";

<$fh>; # erste Zeile überlesen;

my $z2 = <$fh>; # zweite zeile lesen
die "falsches Dateiformat in Zeile 2" unless $z2 =~ /ODPS_\d+_\d+/;
my $z3 = <$fh>; # dritte Zeile Lesen
die "falsches Dateiformat in Zeile 3" unless $z3 =~ /Date\s*(\d+\.\d+\.\d+)\s*Time\s*(\d+:\d+:\d+)/;
my ($datum, $zeit) = ($1, $2);

print "Datum [$datum] Zeit [$zeit]\n"; # Testausgabe

my $state = 0; # Zustand: 0 = außerhalb eines DB-Blocks
# 1 = innerhalb eines DB-Blocks
my $dbname = ''; # Name der DB
my %ergebnis = ( # Ergebnishash
'Datum' => $datum,
'Zeit' => $zeit,
);
while (<$fh>) { # Rest der Datei lesen und dabei Verarbeiten
#
# Sind wir innerhalb eines DB-Blocks?
#
if ($state) {
#
# ist die gelesene Zeile leer?
#
if (/^\s*$/) {
$state = 0; # Status umsetzen
$dbname = ''; # DB-Namen löschen
}
#
# anderenfalls Werte ermiteln und abspeichern:
#
else {
/(\S+)\s+(\S+)\s+(\S+)\s+(\S+)\s+(\S+)/;
push @{ $ergebnis{'DB'}->{$dbname} }, {
spalte1 => $1,
spalte2 => $2,
spalte3 => $3,
spalte4 => $4,
spalte5 => $5,
};
}
}
#
# Sonst sind wir außerhalb:
#
else {
if (/(KDY_.*\s*)$/) {
$state = 1; # Status umsetzen
chomp($dbname = $1); # DB-Namen löschen
print "DB [$dbname]\n"; # Testausgabe
}
}
}

use Data::Dumper;
$Data::Dumper::Sortkeys = 1;

print Dumper \%ergebnis;
}


Es erzeugt ein Ergebnishash %ergebnis, das die folgende Form hat:

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
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
$VAR1 = {
'DB' => {
'KDY_bgn_seq' => [
{
'spalte1' => 'bgn_5px',
'spalte2' => '2.000000',
'spalte3' => '0.000000',
'spalte4' => '0.000000',
'spalte5' => 'Fail'
},
...
],
'KDY_lines_seq' => [
{
'spalte1' => 'line_lpvs',
'spalte2' => '0.237976',
'spalte3' => '0.170000',
'spalte4' => '0.230000',
'spalte5' => 'Fail'
},
{
'spalte1' => 'line_lpvl',
'spalte2' => '0.399231',
'spalte3' => '0.260000',
'spalte4' => '0.300000',
'spalte5' => 'Fail'
},
...
],
'KDY_os_45_seq' => [
{
'spalte1' => 'offset_45',
'spalte2' => '1.089027',
'spalte3' => '0.000000',
'spalte4' => '8.000000',
'spalte5' => 'Pass'
}
],
'KDY_printpos_seq' => [
{
'spalte1' => 'Coordinate_TLX',
'spalte2' => '-29.523100',
'spalte3' => '0.000000',
'spalte4' => '0.000000',
'spalte5' => 'Fail'
},
...
],
'KDY_sharpness_seq' => [
{
'spalte1' => 'sharp_tlv',
'spalte2' => '0.056915',
'spalte3' => '0.090000',
'spalte4' => '0.150000',
'spalte5' => 'Fail'
},
...
}
],
'KDY_threshold_seq' => [
{
'spalte1' => 'white_max',
'spalte2' => '163.038700',
'spalte3' => '175.000000',
'spalte4' => '245.000000',
'spalte5' => 'Fail'
},
{
'spalte1' => 'black_max',
'spalte2' => '3.621212',
'spalte3' => '0.000000',
'spalte4' => '30.000000',
'spalte5' => 'Pass'
}
],
'KDY_tilt_seq' => [
{
'spalte1' => 'tilt_meas_1',
'spalte2' => '29.621620',
'spalte3' => '10.000000',
'spalte4' => '15.000000',
'spalte5' => 'Fail'
},
...
]
},
'Datum' => '15.09.2005',
'Zeit' => '11:35:54'
};


Wie ich sehe, sind in der Datei sehr viele Abschnitte mit dem Titel KDY_bgn_seq. Falls diese einzeln abgelegt werden sollen, muss ich das Programm nochmal umschreiben. Aber Du kannst ja erstmal sehen, ob Du verstehst, was da passiert und ob das ungefähr das ist, was Du brauchst.
s--Pevna-;s.([a-z]).chr((ord($1)-84)%26+97).gee; s^([A-Z])^chr((ord($1)-52)%26+65)^gee;print;

use strict; use warnings; Link zu meiner Perlseite

View full thread Macintosh Dateien unter Win in Perl einlesen!