Schrift
[thread]6022[/thread]

Datei lesen und in Hash schreiben? (Seite 2)

Leser: 2


<< |< 1 2 3 4 5 >| >> 46 Einträge, 5 Seiten
Patrick
 2004-01-19 10:33
#79252 #79252
User since
2004-01-07
56 Artikel
BenutzerIn
[default_avatar]
Hi,

ich versuche auch aus einer Datei in ein Hash zu schreiben.
Habe aber vorher alles zeilenweise in ein Array geschrieben.
Die Datei sieht vom Aufbau etwa so aus:

KEYWORD    =    wert       # Kommentar

ich möchte es nun so haben:
Key = KEYWORD
Wert = wert
3.Eintrag =  # Komantar

Hier erst mal mein bisheriger Code
Code: (dl )
1
2
3
4
5
6
7
8
9
foreach (@array)
{
   my @splitter1, @splitter2;

   @splitter1 = split(/=/ , $_);

   #%hash  = ($splitter1[0] => $splitter[1]);
   $hash{$_} = [$splitte1[0] => $splitter1[1]];
}


Stimmt das soweit?

Danke im Voraus!
Mfg
Paddy

Perl ist göttlich, die Kunst besteht darin Perl anwenden zu können.
Crian
 2004-01-19 10:55
#79253 #79253
User since
2003-08-04
5866 Artikel
ModeratorIn
[Homepage]
user image
ich würde es anders machen,

Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#!/usr/bin/perl
use strict;
use warnings;
use Data::Dumper;

my %hash;
my @array = ('KEYWORD = wert # Kommentar',
'KEYWORD2 = wert2 # Kommentar2',
'KEYWORD3=wert3#Kommentar3',
'KEYWORD4 =wert4 # Kommentar4',
);

for (@array) {
my ($key, $val, $com) = m~^(.+?)\s*=\s*(.+?)\s*#\s*(.*)$~;
$hash{$key} = { wert => $val, kommentar => $com };
}

print Dumper(\%hash);


Ausgabe:

Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
$VAR1 = {
'KEYWORD4' => {
'kommentar' => 'Kommentar4',
'wert' => 'wert4'
},
'KEYWORD3' => {
'kommentar' => 'Kommentar3',
'wert' => 'wert3'
},
'KEYWORD2' => {
'kommentar' => 'Kommentar2',
'wert' => 'wert2'
},
'KEYWORD' => {
'kommentar' => 'Kommentar',
'wert' => 'wert'
}
};
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
Patrick
 2004-01-19 11:54
#79254 #79254
User since
2004-01-07
56 Artikel
BenutzerIn
[default_avatar]
Hey, danke.

Jetzt habe ich nur noch das Problem, das die von mir angegebene Struktur nicht immer vorhanden ist!

Hier mal ein kleines Beispiel für die auszulesene Datei:

Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
#
# Project configuration file
#

GENLIST    =  Array2.genlist                   # Kommentar
TERMLIST  =  02_IrgendeineListe             # Kommentar      \
           03_IrgendeineListe             # Kommentar,    \
                                                        # Kommentar
STARTLIST    = dateiname.ids                 # Kommentar
OUTPUTNAME =                                    # Kommentar
CROSSLIST    = 01_XY                          # Kommentar
ADDFILTER  =                                      # Kommentar


Bei den Werten, die über mehrere Zeilen gehen wie z.B. der TERMLIST wird es etwas kniffelig.

Bitte hierbei nochmal um Hilfe von den
Perlgöttern *honig-ums-maul-schmier*

;-)

Vielen Dank im Voraus
Mfg
Paddy

Perl ist göttlich, die Kunst besteht darin Perl anwenden zu können.
format_c
 2004-01-19 12:37
#79255 #79255
User since
2003-08-04
1706 Artikel
HausmeisterIn
[Homepage] [default_avatar]
MMh. So ist ja kein regelmäßiges System drin. Ich kann zumindest keins erkennen. Wenn du aber evtl. die Möglichkeit hättest, die Werte einer Liste mit Whitespaces zu trennen und dann erst die Kommentare dann könnte es z.B. so gehen:

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
my $string = qq~
GENLIST = Array2.genlist # Kommentar
TERMLIST = 02_IrgendeineListe 03_IrgendeineListe # Kommentar \
# Kommentar, \
# Kommentar
STARTLIST = dateiname.ids # Kommentar
OUTPUTNAME = # Kommentar
CROSSLIST = 01_XY # Kommentar
ADDFILTER = # Kommentar
~;

use strict;
use warnings;
use Data::Dumper;

my %hash;


my @lines = split /\r?\n/,$string;
for (@lines) {
if (/(\w+?)\s*?=\s*?(.*?)#/) {
my ($key,$values) = ($1, $2);
my @values = $values =~ /\s*(\S+)\s*/g;
$hash{$key} = [@values];
}
}

print Dumper \%hash;
_ _ END _ _
$VAR1 = {
'ADDFILTER' => [],
'CROSSLIST' => [
'01_XY'
],
'TERMLIST' => [
'02_IrgendeineListe',
'03_IrgendeineListe'
],
'OUTPUTNAME' => [],
'STARTLIST' => [
'dateiname.ids'
],
'GENLIST' => [
'Array2.genlist'
]
};


Ich hoffe das hilft dir etwas.
Gruß Alex
Crian
 2004-01-19 13:32
#79256 #79256
User since
2003-08-04
5866 Artikel
ModeratorIn
[Homepage]
user image
[quote=Patrick,19.01.2004, 10:54]Hey, danke.

Jetzt habe ich nur noch das Problem, das die von mir angegebene Struktur nicht immer vorhanden ist!

Hier mal ein kleines Beispiel für die auszulesene Datei:

Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
#
# Project configuration file
#

GENLIST    =  Array2.genlist                   # Kommentar
TERMLIST  =  02_IrgendeineListe             # Kommentar      \
           03_IrgendeineListe             # Kommentar,    \
                                                        # Kommentar
STARTLIST    = dateiname.ids                 # Kommentar
OUTPUTNAME =                                    # Kommentar
CROSSLIST    = 01_XY                          # Kommentar
ADDFILTER  =                                      # Kommentar


Bei den Werten, die über mehrere Zeilen gehen wie z.B. der TERMLIST wird es etwas kniffelig.

Bitte hierbei nochmal um Hilfe von den
Perlgöttern *honig-ums-maul-schmier*

;-)

Vielen Dank im Voraus[/quote]
Ist es immer so, dass die Zeilen mit Listenelementen auf Backslach enden (bis auf die Zeile mit dem letzten Wert?

Damit könnte &acute;man auch was machen.
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
Patrick
 2004-01-19 15:33
#79257 #79257
User since
2004-01-07
56 Artikel
BenutzerIn
[default_avatar]
Code: (dl )
my ($key, $val, $com) = m~^(.+?)\s*=\s*(.+?)\s*#\s*(.*)$~;


Kann mir jemand die Bedeutung nach dem "=" mal erleutern.

Hab leider  Gottes nicht die leiseste Ahnung was da eigentlich passiert, bis auf das erkennen von = und #!   :-(

Danke
Mfg
Paddy

Perl ist göttlich, die Kunst besteht darin Perl anwenden zu können.
eisbeer
 2004-01-19 15:44
#79258 #79258
User since
2003-08-29
347 Artikel
BenutzerIn
[Homepage] [default_avatar]
[quote=format_c,19.01.2004, 08:23][quote=eisbeer,19.01.2004, 06:34]...aber solang se funktioniert ...[/quote]
Und die Reg-Ex Engine unötig lange braucht...


Gruß Alex[/quote]
Ach komm, das sind nichtmal 0.0001 Sekunden.
Also man müsste schon sehr genau sein.

Wenns euch jetzt besser gefällt:
Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
my $file = 'datei.txt';
my %hash;

open(FILE, "<$file") || die "Fehler: $!\n\n";
while (my $Line = <FILE>) {
chomp $Line;
if ($Line =~/^(\w+)\s+(\w+)(\s*#.*)?$/g) {
$hash{$1}=$2;
} else {
next;
}
}
close FILE;

Ich wüsste nicht, was jetzt noch kompliziert ist :)

Patrick:
Beliebige viele (oder auch keine) beliebige Zeichen, gefolgt von 0 bis n Leerstellen (\n oder \t oder ' '), gefolgt von einem
=, wieder 0 bis n Leerstellen, wieder beliebige viele (oder auch keine) beliebige Zeichen, wieder 0 bis n Leerstellen, ein #,
wieder Leerstellen, und als letztes noch 0 bis n beliebige Zeichen.

Erkennt zB:
Hallo das ist ein Test 1ß123 = noch sowas # hier ein kommentar
Die meisten PC Probleme befinden sich zwischen Bildschirm und Stuhl...
format_c
 2004-01-19 20:35
#79259 #79259
User since
2003-08-04
1706 Artikel
HausmeisterIn
[Homepage] [default_avatar]
[quote=eisbeer,19.01.2004, 14:44]Ach komm, das sind nichtmal 0.0001 Sekunden.
Also man müsste schon sehr genau sein.[/quote]
Unterschätz das nicht. Der Unterschied mag bei kleinen Strings nicht sooooo gravierend sein, jedoch je größer der String, um so langsamer die Reg-Ex. Kannst es gerne probieren. perldoc Benchmark

Gruß Alex
eisbeer
 2004-01-19 21:11
#79260 #79260
User since
2003-08-29
347 Artikel
BenutzerIn
[Homepage] [default_avatar]
Danke, ich habs schon ausprobiert, ich
stütze mich ja nicht auf hohle Fakten,
bei mir gings auch bei einem langen String
zügig unter 0.0001 sekunden (Time::Hires).

Is aber doch Haarspalterei, er soll selber
entscheiden, was er nimmt.
Die meisten PC Probleme befinden sich zwischen Bildschirm und Stuhl...
Crian
 2004-01-19 21:47
#79261 #79261
User since
2003-08-04
5866 Artikel
ModeratorIn
[Homepage]
user image
@Patrick: Antworte doch bitte mal auf meine Frage

> Ist es immer so, dass die Zeilen mit Listenelementen auf Backslach enden (bis auf die Zeile mit dem letzten Wert)?

Wenn ja, kann man da noch was löten, wenn nein, kann man etwas machen, falls die Werte auf keinen Fall Whitespace enthalten.

Also sag mal näheres dazu :)
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 5 >| >> 46 Einträge, 5 Seiten



View all threads created 2004-01-18 22:12.