Wie Zeile (ohnne Schlüssel/Wert) in ein hash einlesen?
günther
- perl
Hallo Perl-Experten,
ich möchte eine Zeile splitten und in ein hash einlesen:
%hash = (
feld1 => 'stuff',
feld2 => 'stuff'',
feld3 => 'stuff'
)
Die Zeile sieht so aus:
inhalt1inhalt2inhalt3
splitten und in ein array einlesen kann ich, aber direkt in ein hash?
wie ordne ich die Werte den Schlüsseln zu?
field1 <-- inhalt1
field2 <-- inhalt2
...
PS: Archiv und perldoc hab ich brav durchgekämmt ;-) oder :-(
Danke für Tipps!
Günther
Sup!
Wenn Du keine vernünftigen Schlüssel hast, warum nimmst Du nicht ein Array?
Gruesse,
Bio
Hallo Bio,
Wenn Du keine vernünftigen Schlüssel hast, warum nimmst Du nicht ein Array?
aehm...siehe Posting:
"splitten und in ein array einlesen kann ich..."
Bitte nicht:
Frage: ich suche ein rotes Tuch
Antwort: nimm ein blaues Tuch
Grüße,
günther
Hallo Günther,
Bitte nicht:
Frage: ich suche ein rotes Tuch
Antwort: nimm ein blaues Tuch
ich würde zwar auch das blaue nehmen, aber wenn's unbedingt rot sein sollte (sicherlich nur eine Variante):
while(<IN>)
{
chomp;
my(@content) = split('',$_);
my($i);
for $i (0 .. $#content)
{
$content{"feld$i"} = $content[$i];
}
}
oder vielleicht
@Schluessel = ("ABRA","KADA","BRA","SIM","SALA","BIM");
while(<IN>)
{
chomp;
my(@content) = split('',$_);
my($i);
for $i (0 .. $#Schluessel)
{
$content{$Schluessel[$i]} = $content[$i];
}
}
Grüße
Klaus
Hallo Klaus,
vielen Dank, leider hab ich mich unklar ausgedrueckt
while(<IN>)
{
chomp;
my(@content) = split('',$_);
my($i);
for $i (0 .. $#content)
{
$content{"feld$i"} = $content[$i];
}
}
ich hab ca. 120 Schlüssel/Werte ohne fortlaufende Nummerierung :-(
die Schlüssel heissen halt z.B.
hausnummer
strasse
ort
plz
....
$i = 25
wie bringe ich nun $content[i] genau zum 25. Schlüssel
mit der Funktion keys müsste es doch irgendwie gehen?
die hashes werden ja nicht listenweise angesprochen, sondern zufällig
Vielleicht hast Du nochmal einen Tip?
günther
Hallo,
ich hab ca. 120 Schlüssel/Werte ohne fortlaufende Nummerierung :-(
die Schlüssel heissen halt z.B.
hausnummer
strasse
ort
plz
....
$i = 25
wie bringe ich nun $content[i] genau zum 25. Schlüssel
mit der Funktion keys müsste es doch irgendwie gehen?
die hashes werden ja nicht listenweise angesprochen, sondern zufällig
verstehe ich jetzt nicht. Drück dich etwas deutlicher aus.
Gibt Beispiele an!
Wie sehen deine Daten aus?
Wie soll das Ergebnis aussehen?
Welche Verarbeitung soll dazwischen passieren?
Was willst Du eigentlich wirklich machen?
Grüße
Klaus
Hallo Klaus,
sorry wenn ich mich undeutlich ausgedrueckt habe, nochmal:
gegeben:
%hash = (
'vorname' => 'stuff',
'name' => 'stuff'',
'strasse' => 'stuff'
'plz' => 'stuff'
'ort' => 'stuff'
...und noch 120 Schlüssel/Werte
)
gegeben:
KlausHuberAhornstrasse 345785Testhausen..........
Ergebnis soll sein:
%hash = (
'vorname' => 'Klaus',
'name' => 'Huber'',
'strasse' => 'Ahornstrasse 3'
'plz' => '45785'
'ort' => 'Testhausen'
...und noch 120 Schlüssel/Werte
)
Grüsse
günther
Hallo Klaus,
sorry wenn ich mich undeutlich ausgedrueckt habe, nochmal:
gegeben:
%hash = (
'vorname' => 'stuff',
'name' => 'stuff'',
'strasse' => 'stuff'
'plz' => 'stuff'
'ort' => 'stuff'
...und noch 120 Schlüssel/Werte
)
könnte doch auch so aussehen:
@Schluessel = ('vorname','name','strasse','plz','ort',...);
oder?
Das Problem ist, wie DU schon sagtest, daß die Schlüssel eines Arrays unsortiert sind. Irgendwo mußt Du einfach einmal festlegen, _wie_ die Reihenfolge genau aussieht, in der die Daten in der Zeile stehen. 'keys' liefert einfach nur alle keys eines heashes, aber nicht in einer bestimmten Reihenfolge. Du kannst sie dann zwar mit 'sort' wieder sortieren, aber nach welchen Kriterien ? Alphabetisch ist nicht, weil das aj sicherlich nicht Deiner Reihenfolge entspricht.
Also bleibt Dir nichts anderes übrig, als die Reihenfolge irgendwie festzulegen.
gegeben:
KlausHuberAhornstrasse 345785Testhausen..........
Hier ist die Reihenfolge festgelegt, als da muß Du Dich ja dran halten.
Ergebnis soll sein:
%hash = (
'vorname' => 'Klaus',
'name' => 'Huber'',
'strasse' => 'Ahornstrasse 3'
'plz' => '45785'
'ort' => 'Testhausen'
...und noch 120 Schlüssel/Werte
)
Möglichkeit 1:
(Mein Favorit)
#hier wird die Reihenfolge festgelegt
@Schluessel = ('vorname','name','strasse','plz','ort',...);
sub einlesen
{
# File aufmachen und so
while(<IN>)
{
chomp;
my(@content) = split('',$_); #einlesen und aufteilen der eingabe
my($i);
my(%hash) = (); # hash leeren
for $i (0 .. $#Schluessel) #für jeden eintrag in Schluessel
{
$hash{$Schluessel[$i]} = $content[$i]; ' Wertzuweisung
}
push @Records,{%hash}; # hier wird eine Liste von hashes angelegt
}
}
sub rausschreiben
{
# File aufmachen und so
foreach my $href (@Records)
{
for $i (0 .. $#Schluessel) #für jeden eintrag in Schluessel
{
print OUT '' if $i; # ab dem zweiten Wert ein Trennzeichen
print $href->{$Schluessel[$i]}
}
print "\n";
}
}
Möglichkeit 2:
(Würde ich nicht machen, weil viel Schreibarbeit, und hoher Änderungsaufwand)
sub einlesen
{
# File aufmachen und so
while(<IN>)
{
chomp;
my(@content) = split('',$_); #einlesen und aufteilen der eingabe
my($i);
my(%hash) = (); # hash leeren
$hash{'vorname'} =$content[0];
$hash{'name'} =$content[1];
[usw.]
push @Records,{%hash}; # hier wird eine Liste von hashes angelegt
}
}
sub rausschreiben
{
# File aufmachen und so
foreach my $href (@Records)
{
print $href->{'vorname'};
print "$href->{'name'};
[usw.]
print "\n";
}
}
so, ich glaub' jetzt haben wir es ;-)
Grüße
Klaus
Hallo Klaus,
herzlichen Dank, ich denke so komme ich weiter.
könnte doch auch so aussehen:
@Schluessel = ('vorname','name','strasse','plz','ort',...);
...aah!
so, ich glaub' jetzt haben wir es ;-)
..puuh!
Grüße,
günther
Hallo Ihr zwei!
Das Ihr Euch das Leben immer so kompliziert machen müßt ;-) Nun ja es heißt ja aber auch TIMTOWTDI ...
#hier wird die Reihenfolge festgelegt
@Schluessel = ('vorname','name','strasse','plz','ort',...);sub einlesen
{
# File aufmachen und so
while(<IN>)
{
chomp;
my(@content) = split('',$_); #einlesen und aufteilen der eingabe
Der folgende Teil geht kürzer:
my($i);
my(%hash) = (); # hash leerenfor $i (0 .. $#Schluessel) #für jeden eintrag in Schluessel
{
$hash{$Schluessel[$i]} = $content[$i]; ' Wertzuweisung
}
my(%hash) = (); # hash leeren kann man ja noch mal machen - einmal hätte aber auch gereicht.
@hash{@Schlüssel} = @content;
Gruß,
Jörk
Hi,
%hash = (
feld1 => 'stuff',
feld2 => 'stuff'',
feld3 => 'stuff'
field1 <-- inhalt1
field2 <-- inhalt2
Du redest von feld, stuff, field und inhalt. Was willst du jetzt eigentlich?
Willst du den Schlüssel-Namen den Inhalt von "inhalt1" geben, und den dazugehörigen Werten die
Zeichenfolge 'stuff', oder wie?
Gruß,
Slyh
Halloo Sly,
%hash = (
feld1 => 'stuff',
feld2 => 'stuff'',
feld3 => 'stuff'field1 <-- inhalt1
field2 <-- inhalt2Du redest von feld, stuff, field und inhalt. Was willst du jetzt eigentlich?
Willst du den Schlüssel-Namen den Inhalt von "inhalt1" geben, und den dazugehörigen Werten die
Zeichenfolge 'stuff', oder wie?
sorry es muss feld1 statt field1 heissen.
stimmt aber auch nicht ganz:
stuff ist die Vorbelegung
stuff soll durch inhalt1 ersetzt werden
inhalt1inhalt2inhalt3
den ersten Wert zum ersten Schlüssel
den zweiten Wert zum zweiten Schlüssel
...
von Klaus ist schon ein Ansatz da, leider haben die Schlüssel alle
unterschiedliche Bezeichnungen, also keine Nummern.
Grüße
günther