Schrift
[thread]7295[/thread]

Macintosh Dateien unter Win in Perl einlesen! (Seite 3)



<< |< 1 2 3 4 >| >> 31 Einträge, 4 Seiten
Crian
 2005-09-26 14:29
#58265 #58265
User since
2003-08-04
5873 Artikel
ModeratorIn
[Homepage]
user image
Naja, ich hab die Datei vorliegen ;) - welchen Teil willst Du denn haben? Kannst Du Anfang / Ende (oder den Anfang dessen, was danach kommt) eindeutig beschrieben?
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
Weman
 2005-09-26 14:48
#58266 #58266
User since
2005-08-10
17 Artikel
BenutzerIn
[default_avatar]
Hi nochmal.

du komm doch nach München dann geb ich Dir für Deine Hilfe aufm Oktoberfest ein Bier aus! :-)

Also ich brauche z.B. die 2. Zeile (1. ist ja leer) dann Datum und Uhrzeit in einer Var!

Dann muss wieder bis nach KDY_.... gesprungen werden, da dies der Tabellenname ist! In dieser Tabelle müssen dann der Name stehen und jeweils die ersten 2 Werte! Der 3. Wert und pass und fail wird wieder nicht benötigt. Danach nächste Zeile nehmen etc..... Dann wieder bis KDY_.... Name nehmen und ersten 2 Werte etc.....

Also, sau viele Sachen und ich hab noch nie mit Reg. Ex. gearbeitet. Bin hier nur als Praktikant :-)

Viele liebe Grüße

Weman
Crian
 2005-09-26 14:54
#58267 #58267
User since
2003-08-04
5873 Artikel
ModeratorIn
[Homepage]
user image
Ok, ich geh mal von der umgewandelten Datei aus :-)

Ich schreib gerade mal was, bis später...
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
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
Weman
 2005-09-26 16:08
#58269 #58269
User since
2005-08-10
17 Artikel
BenutzerIn
[default_avatar]
Hallo,

also, nochmals vielen lieben Dank! Klar hilft mir das weiter. Bißchen programmieren kann ich ja :-)

Werd mir jetzt auch mal das Modul IO::File ansehen!

Wollte es gleich mal testen bei mir kommt die Fehlermeldung:

Use of uninitialized value in pattern match (m//) at I:\eder\KDY\test.pl line 17
, <GEN0> line 1.
falsches Dateiformat in Zeile 2 at I:\eder\KDY\test.pl line 17, <GEN0> line 1.

Komischerweise kommt das öfters! Muss man vorher irgendwas für Reg. installieren? Nicht oder???

Liebe Grüße
Strat
 2005-09-26 16:24
#58270 #58270
User since
2003-08-04
5246 Artikel
ModeratorIn
[Homepage] [default_avatar]
werden da zufaellig die Datensaetze durch eine leerzeile getrennt? ich werde diesbezueglich aus dem code nicht recht schlau. Falls ja, kann man auch sowas wie das folgendes machen:
{
local $/ = "\n\n"; # blocktrennzeichen auf leere zeile setzen
while (<FH>) {
my @lines = split(/\n/, $_);
..
[/code]
probieren
perl -le "s::*erlco'unaty.'.dk':e,y;*kn:ai;penmic;;print"
http://www.fabiani.net/
renee
 2005-09-26 16:27
#58271 #58271
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
Die Datensätze scheinen - nach Crians Code zu schließen - durch ne Leerzeile getrennt zu sein. Dann würde ich eher sowas machen:
Code: (dl )
1
2
3
4
5
6
7
8
9
10
my $file = '/path/to/file';

{
local $/ = "\n\n";
open(my $fh,"<$file") or die $!;
while(my $entry = <$fh>){
# bearbeite Datensatz
}
close $fh;
}
OTRS-Erweiterungen (http://feature-addons.de/)
Frankfurt Perlmongers (http://frankfurt.pm/)
--

Unterlagen OTRS-Workshop 2012: http://otrs.perl-services.de/workshop.html
Perl-Entwicklung: http://perl-services.de/
Crian
 2005-09-28 15:40
#58272 #58272
User since
2003-08-04
5873 Artikel
ModeratorIn
[Homepage]
user image
Nein, die Datensätze für einen Block sind nur durch einen Umbruch getrennt. Am Blockende folgt eine Leerzeile, der nächste Block beginnt dann in der Zeile danach.

Deshalb ja auch die State-Machine. Dass ihr das nicht aus dem Code lesen konntet schockiert mich jetzt aber etwas ^^

Der Code läuft mit der Datei die ich habe ohne Probleme und Meldungen.

[quote=Weman,26.09.2005, 14:08]Use of uninitialized value in pattern match (m//) at I:\eder\KDY\test.pl line 17
, <GEN0> line 1.
falsches Dateiformat in Zeile 2 at I:\eder\KDY\test.pl line 17, <GEN0> line 1.[/quote]


Im Code steht doch genau warum ^^
Code: (dl )
die "falsches Dateiformat in Zeile 2" unless $z2 =~ /ODPS_\d+_\d+/;


Ich hab ja auch geschrieben, dass ich mich sehr an dieser einen Datei orientiert habe.\n\n

<!--EDIT|Crian|1127908081-->
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
renee
 2005-09-28 15:47
#58273 #58273
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
Naja, in Deinem Code heißt es aber:
Code: (dl )
1
2
3
4
5
6
7
           #
# ist die gelesene Zeile leer?
#
if (/^\s*$/) {
$state = 0; # Status umsetzen
$dbname = ''; # DB-Namen löschen
}
OTRS-Erweiterungen (http://feature-addons.de/)
Frankfurt Perlmongers (http://frankfurt.pm/)
--

Unterlagen OTRS-Workshop 2012: http://otrs.perl-services.de/workshop.html
Perl-Entwicklung: http://perl-services.de/
Crian
 2005-09-28 15:48
#58274 #58274
User since
2003-08-04
5873 Artikel
ModeratorIn
[Homepage]
user image
Ja eben. Dann wird der State umgesetzt und danach beginnt ev. ein neuer Block.
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
<< |< 1 2 3 4 >| >> 31 Einträge, 4 Seiten



View all threads created 2005-09-20 12:57.